R循环遍历列表中的多个数据帧

时间:2016-01-04 20:42:55

标签: r dataframe

尝试计算一行中每两个值之间的差异,然后对列表中每个数据帧的总差异求和。我知道R中的/ 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
}

示例数据: list 1 refdata [[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

2 个答案:

答案 0 :(得分:2)

一种方法(按照未列出的数据框)可以使用逻辑向量进行索引 - 它们的值为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)])) })

thx Heroka

答案 1 :(得分:1)

# 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)))