r之根据列中的共同值将大数据框拆分为数据框列表
zhengyun_ustc
阅读:54
2025-05-04 20:05:19
评论:0
我有一个包含 10 列的数据框,收集“用户”的操作,其中一列包含一个 ID(不是唯一的,标识用户)(第 10 列)。数据帧的长度约为 750000 行。我正在尝试提取由包含“用户”标识符的列拆分的单个数据帧(因此获取数据帧的列表或向量),以隔离单个参与者的操作。
ID | Data1 | Data2 | ... | UserID
1 | aaa | bbb | ... | u_001
2 | aab | bb2 | ... | u_001
3 | aac | bb3 | ... | u_001
4 | aad | bb4 | ... | u_002
导致
list(
ID | Data1 | Data2 | ... | UserID
1 | aaa | bbb | ... | u_001
2 | aab | bb2 | ... | u_001
3 | aac | bb3 | ... | u_001
,
4 | aad | bb4 | ... | u_002
...)
以下对我来说在一个小样本(1000行)上非常有效:
paths = by(smallsampleMat, smallsampleMat[,"userID"], function(x) x)
然后例如通过路径[1]访问我想要的元素。
当应用于原始的大型数据帧甚至矩阵表示时,这会阻塞我的机器(4GB RAM,MacOSX 10.6,R 2.15)并且永远不会完成(我知道存在更新的 R 版本,但我相信这不是主要问题)。
似乎 split 性能更高,并且在很长一段时间后完成,但我不知道(劣质 R 知识)如何将结果向量列表拼凑成矩阵向量。
path = split(smallsampleMat, smallsampleMat[,10])
我也考虑过使用
big.matrix等等,但没有太大的成功来加快这个过程。
请您参考如下方法:
您可以使用例如轻松访问列表中的每个元素path[[1]] .您不能将一组矩阵放入原子向量并访问每个元素。矩阵是具有维度属性的原子向量。我会使用 split 返回的列表结构,这就是它的设计目的。每个列表元素都可以保存不同类型和大小的数据,因此用途非常广泛,您可以使用 *apply函数进一步对列表中的每个元素进行操作。下面的例子。
# For reproducibile data
set.seed(1)
# Make some data
userid <- rep(1:2,times=4)
data1 <- replicate(8 , paste( sample(letters , 3 ) , collapse = "" ) )
data2 <- sample(10,8)
df <- data.frame( userid , data1 , data2 )
# Split on userid
out <- split( df , f = df$userid )
#$`1`
# userid data1 data2
#1 1 gjn 3
#3 1 yqp 1
#5 1 rjs 6
#7 1 jtw 5
#$`2`
# userid data1 data2
#2 2 xfv 4
#4 2 bfe 10
#6 2 mrx 2
#8 2 fqd 9
使用
[[ 访问每个元素像这样的运算符:
out[[1]]
# userid data1 data2
#1 1 gjn 3
#3 1 yqp 1
#5 1 rjs 6
#7 1 jtw 5
或使用
*apply函数对每个列表元素进行进一步的操作。例如,取
data2 的平均值您可以像这样使用 sapply 列:
sapply( out , function(x) mean( x$data2 ) )
# 1 2
#3.75 6.25
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。



