在R中将向量列表的列表转换为数据框。

4

我有一个数字向量列表的列表。我想要:

  1. 对每个向量求和
  2. 将每个内部标量列表转换为向量
  3. 将这些向量组合成一个数据框,其中向量是行

我拼凑了下面的代码,但是似乎这很笨拙,不是R的方式。我怀疑如果使用rapply和四个步骤,那么我做错了什么(不是在结果方面,而是在效率和理解方面)。有没有正确的方法来执行此操作?

dat1 <- list(list(1:2, 3:4), list(5:6, 7:8))
dat2 <- rapply(dat1, sum, how="list") 
dat3 <- lapply(dat2, unlist)
dat4 <- do.call(rbind, dat3)
dat5 <- data.frame(dat4)

所需输出为:
> dat5
  X1 X2
1  3  7
2 11 15
> class(dat5)
[1] "data.frame"
2个回答

3

嗯,我不确定是否更有效,但是这里有类似的东西:

as.data.frame(matrix(rapply(dat1,sum), nrow=length(dat1), byrow=TRUE))
X1 X2
1  3  7
2 11 15

肯定更有效率。您正在使用matrix替换do.callunlistlapplyrbind。更不用说由<-制作的所有副本了。即使仅使用as.data.frame也比data.frame更快。 - David Arenburg

3

这种方法可以一步到位,与使用matrix相比效率差别不大。

> as.data.frame(do.call(rbind, rapply(dat1, sum, how = "list")))
#   X1 X2
# 1  3  7
# 2 11 15

> f1 <- function() 
      as.data.frame(matrix(rapply(dat1,sum), nrow=length(dat1), byrow=TRUE))
> f2 <- function() 
      as.data.frame(do.call(rbind, rapply(dat1, sum, how = "list")))
> library(microbenchmark)
> microbenchmark(f1(), f2())
# Unit: microseconds
#  expr    min      lq median       uq     max neval
#  f1() 91.047 92.7105  93.94 102.2855 199.305   100
#  f2() 95.213 97.3150  98.43 101.8240 134.403   100

对于这个例子来说,差异不大。


1
谢谢你的基准测试课程。低均值/高方差 vs 高均值/低方差。我想我终于找到了rapply的合理用途。 - Richard Herron
但是我的数据框中的每个向量仍然是列表。有没有办法解决这个问题?还是我回到了最初的解决方案? - Richard Herron
是的(在这种情况下它们将是整数)。 - Richard Herron
看起来使用 rapplyunlist,然后通过 matrix 解决这个问题。我应该标记另一个解决方案,因为它经过 unlist,对我的情况更好。 - Richard Herron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接