代码之家  ›  专栏  ›  技术社区  ›  CptNemo

R: 合并多个列的索引为无序集合的数据帧

  •  1
  • CptNemo  · 技术社区  · 10 年前

    我有一个国家列表

    countries <- c("MAL","CHL","URU","YPR","OMA","GUY","HON","SAL","CYP")
    

    以及两个包含两国之间所有可能二元关系的数据帧

    set.seed(28100)
    df1 <- as.data.frame(t(combn(countries, 2)))
    df1$year <- sample(1800:2000, 36)
    df1$value1 <- sample(1:100, 36)
    
    df2 <- as.data.frame(t(combn(rev(countries), 2)))
    df2$year <- sample(1800:2000, 36)
    df2$value2 <- sample(LETTERS, 36, replace = TRUE)
    

    现在我想按国家和年份合并这两个数据帧( by = c("V1","V2","year") )而不用担心这对国家的实际排列顺序。 所以观察结果 V1 == "SAL" V2=="CYP" 可以与合并 V1==“SAL” V2==“密码” V2 == "SAL" V1=="CYP" .

    1 回复  |  直到 10 年前
        1
  •  0
  •   pcantalupo    10 年前

    这使用从每个数据帧的V1 V2列生成的索引列。索引列包含V1和V2列之间的连接的排序单词。

    # `strSort` was taken from http://stackoverflow.com/questions/5904797/how-to-sort-letters-in-a-string-in-r
    strSort <- function(x)
      sapply(lapply(strsplit(x, NULL), sort), paste, collapse="")
    
    #df1
    index=paste0(as.character(df1[,1]), as.character(df1[,2]))
    df1$index=strSort(index)
    
    #df2
    index=paste0(as.character(df2[,1]), as.character(df2[,2]))
    df2$index=strSort(index)
    
    merge(df1,df2,by="index")
    

    部分输出:

    #     index V1.x V2.x year.x value1 V1.y V2.y year.y value2
    # 1  AALLMS  MAL  SAL   1883     35  SAL  MAL   1971      Y
    # 2  AALMMO  MAL  OMA   1915     75  OMA  MAL   1816      A
    # 3  AALMOS  OMA  SAL   1806     95  SAL  OMA   1894      X
    # 4  ACHLLM  MAL  CHL   1870     27  CHL  MAL   1991      U
    # 5  ACHLLS  CHL  SAL   1949     55  SAL  CHL   1928      E
    # 6  ACHLMO  CHL  OMA   1966     31  OMA  CHL   1839      X
    # 7  ACLMPY  MAL  CYP   1830     15  CYP  MAL   1912      Y
    # 8  ACLPSY  SAL  CYP   1881     60  CYP  SAL   1995      M