我在这里发现了两个帖子,它解决了我的问题。第一个是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的长度都不同,并且与第二个示例中的不同。
答案 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