为不同的长度添加按行名称列

时间:2016-07-04 13:02:56

标签: r dataframe

我在这里发现了两个帖子,它解决了我的问题。第一个是here,第二个是here

我的情况有点不同。我有一个具有不同长度的数据框列表,我想连接到有关行名称的一个数据框。如果某些行名称不在数据框中,则该列应具有NaN值。

例如,我接下来有三个数据框:

mylist[1] - > DF1:

    num
a   1
b   1

mylist[2] - > DF2:

    num
a   1
b   2
c   3
d   1

mylist[3] - > DF3:

    num
c   1
d   1

我想要的是拥有下一个DataFrame:

   num1   num2  num3
a  1      1     NaN
b  1      2     NaN
c  NaN    3     1
d  NaN    1     1

这意味着,NaN值位于正确的位置而不是列的底部,就像第一个示例中一样。所有DataFrame的长度都不同,并且与第二个示例中的不同。

3 个答案:

答案 0 :(得分:2)

我会分两步完成:

1)添加一个包含rownames的id列:

mylist <- lapply(mylist, function(x) transform(x, id = row.names(x)))

2)通过id-column合并所有data.frame:

Reduce(function(...) merge(..., by = "id", all=TRUE), mylist)
#  id num.x num.y num
#1  a     1     1  NA
#2  b     1     2  NA
#3  c    NA     3   1
#4  d    NA     1   1

如果您在mylist中有很多项目,那么这种方法很有用,因为您不必手动输入每个merge命令。

答案 1 :(得分:2)

我们可以通过row.names合并all = TRUE:

helper.o: ../C/helper.c ../C/helper.h
        gcc -c ../C/helper.c

main.o: main.c main.h
        gcc -c main.c

testprog: main.o helper.o
        g++ main.o helper.o -o testprog

答案 2 :(得分:1)

您可以使用merge执行此操作。

matrix(c("a","b",3,4),2,2)
df1 <- data.frame(label=c("a","b"),num1=c(1,1))
df2 <- data.frame(label=c("a","b","c","d"),num2=c(1,2,3,1))
df3 <- data.frame(label=c("c","d"),num3=c(1,1))

result <- merge(merge(df1,df2,by="label",all=TRUE),df3,by="label",all=TRUE)

> result
  label num1 num2 num3
1     a    1    1   NA
2     b    1    2   NA
3     c   NA    3    1
4     d   NA    1    1