【发布时间】:2018-03-16 15:14:31
【问题描述】:
我有如下排列的数据:
- 列表
- 在列表中,每个元素都是一个数据框(50 个数据框)
- 这些数据帧中的每一个都包含 5 行数字,有 9 个命名列(所有 50 个数据帧都有相同的 9 个名称)
我的目标是有效地重新排列这些数据,以便:
- “第二维”(在上面的描述中为 1 到 5)成为第一维。
- “第一个维度”(上述描述中的范围为 1 到 50)成为第二个维度。
- 我只保留了 9 个命名列中的一部分(其余的可以丢弃),按名称选择
- 我希望将所有数字存储在一个数组中(或者其他更高效的数据结构也可以),而不是这些低效的列表和数据框。
示例数据可以使用以下代码生成(简化为只有 2 个数据帧,每个数据帧 5 行 3 列):
example_list<-lapply(X=1:2, FUN=function(X){setNames(data.frame(X*c(1:5), -X*c(1:5), X*100*c(1:5)), c("C1", "C2", "C3"))})
这将创建以下两个数据框的列表:
> example_list[1]
C1 C2 C3
1 1 -1 100
2 2 -2 200
3 3 -3 300
4 4 -4 400
5 5 -5 500
> example_list[2]
C1 C2 C3
1 2 -2 200
2 4 -4 400
3 6 -6 600
4 8 -8 800
5 10 -10 1000
我的当前解决方案(带有示例数据的硬编码数字)如下所示。在这种情况下,我假设我们只关心名为“C1”和“C2”的列:
important_cols <- c("C1", "C2")
result <- array(0, c(5, 2, length(important_cols)))
for(i in 1:5){
for(j in 1:2){
result[i,j,] <- c(example_list[[j]][i,important_cols], recursive=T)
}
}
它给出以下输出:
> result
, , 1
[,1] [,2]
[1,] 1 2
[2,] 2 4
[3,] 3 6
[4,] 4 8
[5,] 5 10
, , 2
[,1] [,2]
[1,] -1 -2
[2,] -2 -4
[3,] -3 -6
[4,] -4 -8
[5,] -5 -10
例如,result[5,2,] = [10, -10] 对应于原始数据的 2nd 数据帧的第 5th 行(已删除第三列)。
上述解决方案有效,但我不禁怀疑应该有一个比手动实现的双重 for 循环和逐个设置所有元素更有效的解决方案一个。
【问题讨论】:
标签: r performance dataframe