首页 文章

在R中逐行和逐列合并数据帧

提问于
浏览
0

如何合并两个数据帧,一个是列,另一个是行?例如,我有两个这样的数据框:

A:    add1 add2 add3 add4  
  1   k    NA   NA   NA 
  2   l    k    NA   NA 
  3   j    NA   NA   NA 
  4   j    l    NA   NA

B:    age  size name  
  1   5    6    x   
  2   8    2    y  
  3   1    3    x
  4   5    4    z

我想通过row.name合并两个data.frames . 但是,我想合并data.frame A列,而不是行 . 所以,我正在寻找一个像这样的data.frame结果:

C:id  age  size name add  
  1   5    6    x   k
  2   8    2    y   l
  2   8    2    y   k
  3   1    3    x   j
  4   5    4    z   j
  4   5    4    z   l

例如,假设您有表B中人员的信息,包括姓名,大小等 . 这些信息是唯一值,因此您在B中每人有一行 . 然后,假设在表A中,您最多有5个过去的地址人第一列是最新的地址;第二,是第二个最近的地址;现在,如果某人的地址少于5个(例如3个),则该人的4列和5列中包含NA .

我想要实现的是一个数据框(C),它包含所有这些信息 . 因此,对于具有两个地址的人,我将需要表C中的两行,重复唯一值并且仅在列地址中不同 .

我想通过非NA值的数量重复A数据帧的行,同时保持row.names与它们相同(如数据帧D),然后将新数据帧与B合并 . 但是我'我不知道该怎么做 .

D:    address   
  1   k    
  2   l    
  2   k
  3   j
  4   j
  4   l

谢谢!

1 回答

  • 2

    将第一个data.frame更改为long格式,然后很容易 . df1是A而df2是B.我还将数字命名为id .

    require(tidyr)
    
    # wide to long (your example D)
    df1tidy <- gather(df1,addname,addval,-id)
    
    # don't need the original add* vars or NA's
    df1tidy$addname <- NULL
    df1tidy <- df1tidy[!is.na(df1tidy$addval), ]
    
    # merge them into the second data.frame
    merge(df2,df1tidy,by = 'id',all.x = T)
    

相关问题