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.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号