根据列中的公共值将大数据框分割成数据框列表
我有一个数据框10列,收集“用户”的行动,其中一列包含一个ID(不唯一,识别用户)(第10列)。 dataframe的长度约为750000行。 我试图提取单个dataframe(所以得到一个数据框的列表或向量)由包含“用户”标识符的列拆分,以隔离单个参与者的行为。
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]。
当应用在原始的大型dataframe甚至matrix表示,这扼stream器我的机器(4GB内存,MacOSX 10.6,R 2.15),并从来没有完成(我知道一个较新的R版本存在,但我相信这不是主要问题)。
看起来分裂是更高性能的,经过很长时间才完成,但是我不知道(下面的R知识)如何将得到的向量列表分解成matrix向量。
path = split(smallsampleMat, smallsampleMat[,10])
我也考虑过使用big.matrix
等,但没有太多的成功,将加快这一进程。
您可以使用例如path[[1]]
轻松访问列表中的每个元素。 您不能将一组matrix放入一个primefaces向量并访问每个元素。 matrix是具有维度属性的primefaces向量。 我将使用split
返回的列表结构,这是它的devise目的。 每个列表元素可以保存不同types和大小的数据,因此非常灵活,您可以使用*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
偶然发现了这个答案,我实际上希望两个组(包含一个用户的数据和包含一个用户的所有数据的数据)。 这个post的具体内容不是必要的,但我想我会补充,以防有人在Google上search同样的问题。
df <- data.frame( ran_data1=rnorm(125), ran_data2=rnorm(125), g=rep(factor(LETTERS[1:5]), 25) ) test_x = split(df,df$g)[['A']] test_y = split(df,df$g!='A')[['TRUE']]