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

时间:2015-02-24 22:37:05

标签: r merge repeat na

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

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 个答案:

答案 0 :(得分: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)