我有一个包含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)
然后例如通过path [1]访问我想要的元素。
当在原始的大数据帧甚至矩阵表示上应用时,这会使我的机器(4GB RAM,MacOSX 10.6,R 2.15)窒息而无法完成(我知道存在较新的R版本,但是我相信这不是主要问题) )。
似乎分割效果更好,并且经过很长时间才完成,但是我不知道(较差的R知识)如何将向量的结果列表分割成矩阵的向量。
path = split(smallsampleMat, smallsampleMat[,10])
我也考虑过使用big.matrix
etc,但没有成功,这会加速该过程。
您可以使用例如轻松访问列表中的每个元素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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句