对列表中的数据帧行的操作

时间:2015-01-27 16:57:40

标签: r list

我有4个数据帧的列表,每个数据帧有3列10行。第一列是维度,后两列是值。我的目标是循环遍历每个数据帧的列表和行,并为每个数据帧中的每个记录取2个值列的差异。因此,所需的输出将是包含2列的4个数据帧的列表,维度列和方差列。

下面是一个示例,其中x是维度,y1和y2是度量(我的实际列表有5个数据帧,每个数据帧有15个值,每个约9000行)。这只是为了简化它。

提前感谢任何提示。

[[1]]
    x y1 y2
1   1  3  3
2   2  4  4
3   3  5  5
4   4  6  6
5   5  7  7
6   6  8  8
7   7  9  9
8   8 10 10
9   9 11 11
10 10 12 12

[[2]]
    x y2 y2.1
1   1  2    3
2   2  3    4
3   3  4    5
4   4  5    6
5   5  6    7
6   6  7    8
7   7  8    9
8   8  9   10
9   9 10   11
10 10 11   12

[[3]]
    x y3 y2
1   1  4  3
2   2  5  4
3   3  6  5
4   4  7  6
5   5  8  7
6   6  9  8
7   7 10  9
8   8 11 10
9   9 12 11
10 10 13 12

[[4]]
    x y4 y2
1   1  5  3
2   2  6  4
3   3  7  5
4   4  8  6
5   5  9  7
6   6 10  8
7   7 11  9
8   8 12 10
9   9 13 11
10 10 14 12

1 个答案:

答案 0 :(得分:3)

这是一种方法:

lapply(x,function(DF) cbind(
  dim = DF[,1],
  var = apply(DF[,2:3],1,var)
))

@ DavidArenburg的改进:为了提高效率,请将apply来电替换为

var = RowVar(x[,2:3])

其中

RowVar <- function(x) {
  rowSums((x - rowMeans(x))^2)/
  (dim(x)[2] - 1)
}

Noam Ross makes the argument用于RowVar上的矢量化(如*apply)。

除了。如果你有一个矩阵列表而不是data.frames,这可能会更快。由于它们都具有相同的尺寸,您甚至可以考虑将它们放在三维数组中。