gpt4 book ai didi

r - 如何将数据帧列表取消列出到 R 中的单个数据帧中

转载 作者:行者123 更新时间:2023-12-04 06:53:10 25 4
gpt4 key购买 nike

假设我有一个数据框列表:

 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com