如何使用lapply而不是for循环来对R中的数据帧列表执行计算

时间:2017-09-08 19:33:03

标签: r list for-loop lapply

我有30个数据帧的列表。

我想创建一个向量,该向量包含数据帧列表中所有30个数据帧中其中一列的第n个元素的标准差。我不认为我已经清楚地解释了这一点。但是我的for循环的代码应该清楚。

FFT233_sd <- list()
for (i in 1:431999) {FFT233_sd[[i]] <- sd(c(FFT233_data[[1]][i,6], FFT233_data[[2]][i,6], FFT233_data[[3]][i,6], FFT233_data[[4]][i,6], FFT233_data[[5]][i,6], FFT233_data[[6]][i,6], FFT233_data[[7]][i,6], FFT233_data[[8]][i,6], FFT233_data[[9]][i,6], FFT233_data[[10]][i,6], FFT233_data[[11]][i,6], FFT233_data[[12]][i,6], FFT233_data[[13]][i,6], FFT233_data[[14]][i,6], FFT233_data[[15]][i,6], FFT233_data[[16]][i,6], FFT233_data[[17]][i,6], FFT233_data[[18]][i,6], FFT233_data[[19]][i,6], FFT233_data[[20]][i,6], FFT233_data[[21]][i,6], FFT233_data[[22]][i,6], FFT233_data[[23]][i,6], FFT233_data[[24]][i,6], FFT233_data[[25]][i,6], FFT233_data[[26]][i,6], FFT233_data[[27]][i,6], FFT233_data[[28]][i,6], FFT233_data[[29]][i,6], FFT233_data[[30]][i,6]))}

for循环有效,但显然很慢。我被告知我应该使用lapply,但我不明白该怎么做。我尝试过以下方法:

results2738 <- lapply( FFT2738_data , function(x) {sd(x) } )

但是它导致了错误:

Show Traceback

 Rerun with Debug
 Error in is.data.frame(x) : 
   (list) object cannot be coerced to type 'double' In addition: Warning message:
In mean.default(x) : argument is not numeric or logical: returning NA

如果有人可以建议我调查资源,我会很高兴。

2 个答案:

答案 0 :(得分:3)

这样的事情:

FFT233_sd <- sapply(1:431999, function(i) {
  values <- sapply(1:length(FFT233_data), function(j) {
    FFT233_data[[j]][i,6]
  })
  sd(values)
}

答案 1 :(得分:0)

试试这个

可重复的示例,mtcars列表(10次重复)

library(purrr)
L <- map(1:10, ~mtcars)

解决方案

您需要purrr:map

library(purrr)
sixthcol <- Reduce("cbind", map(L, ~.x[,6]))
ans <- apply(sixthcol, 1, sd)

输出

sixthcol <- Reduce("cbind", map(L, ~.x[,6]))

 [1,] 2.620 2.620 2.620 2.620 2.620 2.620 2.620 2.620 2.620 2.620
 [2,] 2.875 2.875 2.875 2.875 2.875 2.875 2.875 2.875 2.875 2.875
 [3,] 2.320 2.320 2.320 2.320 2.320 2.320 2.320 2.320 2.320 2.320
 [4,] 3.215 3.215 3.215 3.215 3.215 3.215 3.215 3.215 3.215 3.215
 [5,] 3.440 3.440 3.440 3.440 3.440 3.440 3.440 3.440 3.440 3.440
 [6,] 3.460 3.460 3.460 3.460 3.460 3.460 3.460 3.460 3.460 3.460
 [7,] 3.570 3.570 3.570 3.570 3.570 3.570 3.570 3.570 3.570 3.570
 [8,] 3.190 3.190 3.190 3.190 3.190 3.190 3.190 3.190 3.190 3.190
 # etc

ans <- apply(sixthcol, 1, sd)

# 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0