【问题标题】:how to use lapply instead of a for loop, to perform a calculation on a list of dataframes in R如何使用 lapply 而不是 for 循环,对 R 中的数据帧列表执行计算
【发布时间】:2018-02-17 18:59:27
【问题描述】:

我有一个包含 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

如果有人可以建议我调查的资源,我会很感激。

【问题讨论】:

  • 将你的 30 个 data.frames 堆叠成一个,遵循 Gregor 的答案stackoverflow.com/a/24376207 的“组合”部分,我想这将是一个更简单的操作。

标签: r list for-loop lapply


【解决方案1】:

类似这样的:

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

【讨论】:

    【解决方案2】:

    试试这个

    可重现的示例,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
    

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-24
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      相关资源
      最近更新 更多