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

将匹配列从长转换为宽

  •  0
  • C_psy  · 技术社区  · 6 年前

    我有df。1.

    ID     B 
    006007 M
    123456 F
    987654 F
    

    和df。2.

    ID     B C
    006007 M N
    006007 M S
    123456 F S
    987654 F W
    

    我想从本质上看 身份证件 从df匹配。2和返回 C 进入df。1,但如果中存在重复,则为每个可能的答案创建一个单独的列 df。2美元ID (即转换 C 从长到宽)。因此,我最终会:

    ID     B C1 C2 C3
    006007 M N   S NA
    123456 F NA  S NA
    987654 F NA  NA W
    

    为了重新迭代,我需要每个ID对应一行,每个ID对应的结果在单独的列中。

    如果你们需要更多的澄清,请告诉我,我真的很感谢你们的帮助,伙计们。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gregor Thomas    6 年前
    # merge the data
    m = merge(df.1, df.2)
    
    # convert it to wide
    library(data.table)
    dcast(m, ID + B ~ C, value.var = "C")
    #       ID B    N    S    W
    # 1   6007 M    N    S <NA>
    # 2 123456 F <NA>    S <NA>
    # 3 987654 F <NA> <NA>    W
    

    我让你把这些列重命名为C1,C2。。。,如果你真的想。


    使用此数据:

    df.1 = read.table(text = "ID     B 
    006007 M
    123456 F
    987654 F", stringsAsFactors = FALSE, header = T)
    
    df.2 = read.table(text = "ID     B C
    006007 M N
    006007 M S
    123456 F S
    987654 F W", stringsAsFactors = FALSE, header = T)