【问题标题】:R looping through multiple dataframes in a listR循环遍历列表中的多个数据帧
【发布时间】:2016-01-04 20:42:54
【问题描述】:

尝试计算一行中每两个值之间的差异,然后将列表中每个数据帧的总差异相加。我知道 R 中的 for/while 循环非常糟糕。我以前有这个工作,但我把它弄坏了。有人可以建议如何使用 apply 系列中的替代方法来优化它吗?当前代码:

 for (i in 1:length(refdata)) { #for each dataframe in a list
    refdif <- as.data.frame(matrix(0, ncol = 1, nrow = nrow(refdata[[i]])))
    refdif1 <- c()
    for (z in 1:ncol(refdata[[i]])) { #for each column in a dataframe
        for(x in 1:nrow(refdata[[i]])) { #for each row in a dataframe
            refdif <- (refdata[[i]][x,z] - refdata[[i]][x,z+1]) #difference of first value + the enxt
            refdif1[x,1] <- (refdif1[x,1] + refidf) #sum of latest difference
        }
    }
    print(refdif1) #where I can conduct tests on each individual dataframe with a column of sums of differences
}

示例数据: 列表 1 参考数据[[1]]

$`1`
     var1 var2 var3 var4 
  1   1     2    3    4
  2   5     6    7    8

$`2`
     var1 var2 var3 var4 
  1   1     2    3    4
  2   5     6    7    8

var 1 + 2 计算出差异,var 3 和 4 计算出差异,然后将每个差异相加并放在一个新数据框中的单列中。 (5-6) + (7-8), (1-2) + (3-4) 等等:

$`1`
     dif  
  1   -2
  2   -2


$`2`
     dif  
  1   -2
  2   -2

【问题讨论】:

  • 这将极大地受益于样本数据列表。
  • @MichaelChirico 已更新

标签: r dataframe


【解决方案1】:

一种方法(每个未列出的数据帧)可能是使用逻辑向量进行索引 - 它们的值是 recycled - 这样计算所有其他列之间的差异并最终将结果 df 逐行求和。

refdata1<-rowSums(refdata[c(T,F)]-refdata[c(F,T)])

编辑

准确的输出可以通过

lapply(refdata, function(df){ data.frame(dif=rowSums(df[c(T,F)]-df[c(F,T)])) })

谢谢Heroka

【讨论】:

  • 您确定需要 colSums 吗?
  • 准确的输出可以通过lapply(refdata, function(df){ data.frame(dif=rowSums(df[c(T,F)]-df[c(F,T)])) })得到
  • 是的 :) 你介意我把它作为更新放在答案中吗?
  • 不,这就是为什么我把它放在评论中(并删除了我的答案,因为你的答案更加优雅)
  • 谢谢大家。效果很好。
【解决方案2】:
# Create test data
x <- rbind(1:4, 5:8)
refdata <- list(x,x)

# Calculate results (all elements should have an even number of columns)
lapply(refdata,  FUN = function(x) x %*% rep_len(c(1, -1), NCOL(x)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2021-11-22
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多