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

标签 r

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

 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/

相关文章:

r - 警告 : Factor contains implicit NA

r - 使用 Apply 将数值列转换为带标签的因子

r - 在数据框中交换行和排序

r - 遍历 dplyr 中的列

r - 如何在 Levelplot 上显示矩阵值

r - 如何列出和选择旧版本的 R

基于一行删除多行

r - 使用时间序列数据在 ggplot 中创建垂直线

r - dput(as.Date(df$date)) 显示为数字

r - 是否有一个运算符可以代替函数 coord_map() 的 '+' 符号?