假设我有一个数据框列表:
lst<-list(data.frame(x=1:3,y=2:4, row.names=letters[1:3]),
data.frame(z=1:4,w=2:5, row.names=letters[3:6]),
data.frame(r=2:4,s=3:5, row.names=letters[2:4]))
lst
[[1]]
x y
a 1 2
b 2 3
c 3 4
[[2]]
z w
c 1 2
d 2 3
e 3 4
f 4 5
[[3]]
r s
b 2 3
c 3 4
d 4 5
我的问题是如何将其取消列出到由行名合并的单个数据框并将 NA 替换为 0,例如:
x y z w r s
a 1 2 0 0 0 0
b 2 3 0 0 2 3
c 3 4 1 2 3 4
d 0 0 2 3 4 5
e 0 0 3 4 0 0
f 0 0 4 5 0 0
最佳答案
在基础 R 中:
lst2 <- lapply(lst,function(x) cbind(rowname=rownames(x),x))
df1 <- Reduce(function(x,y) merge(x,y,all=T),lst2)
rownames(df1) <- df1[[1]]
df1 <- df1[-1]
df1[is.na(df1)] <- 0
df1
# x y z w r s
# a 1 2 0 0 0 0
# b 2 3 0 0 2 3
# c 3 4 1 2 3 4
# d 0 0 2 3 4 5
# e 0 0 3 4 0 0
# f 0 0 4 5 0 0
tidyverse
可以使事情更紧凑/可读:
library(tidyverse)
lst %>%
map(rownames_to_column) %>%
reduce(full_join) %>%
`[<-`(is.na(.),value=0) %>%
column_to_rownames
# x y z w r s
# a 1 2 0 0 0 0
# b 2 3 0 0 2 3
# c 3 4 1 2 3 4
# d 0 0 2 3 4 5
# e 0 0 3 4 0 0
# f 0 0 4 5 0 0
直接按行名合并
merge
如果设置参数 by
,则支持按行名合并至 "row.names"
或 0
,但奇怪的是它返回一个包含列 Row.names
的数据框并且没有实际的行名称。这使得 Reduce
调用没有它本来可以的那么流畅,所以最后它并没有比我原来的基本解决方案好多少,可能更糟:
df1 <- Reduce(function(x,y) {
z <- merge(x,y,all=T,by=0)
rownames(z) <- z[[1]]
z[-1]},
lst)
df1[is.na(df1)] <- 0
关于r - 如何将数据帧列表取消列出到 R 中的单个数据帧中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50993047/