我有一个包含10列的数据框,收集“用户”的操作,其中一列包含ID(不唯一,标识用户)(第10列) . 数据帧的长度约为750000行 . 我试图提取由包含“用户”标识符的列分割的单个数据帧(因此得到数据帧的列表或向量),以隔离单个actor的动作 .
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版本,但我相信这不是主要问题) .
似乎拆分更具性能并且在很长一段时间后完成,但我不知道(劣等R知识)如何将得到的向量列表分成矩阵向量 .
path = split(smallsampleMat, smallsampleMat[,10])
我也考虑过使用 big.matrix
等,但没有太大的成功,可以加快这个过程 .
3 回答
您可以使用例如,轻松访问列表中的每个元素 .
path[[1]]
. 您不能将一组矩阵放入原子向量中并访问每个元素 . 矩阵是具有维度属性的原子向量 . 我会使用split
返回的列表结构,它's what it was designed for. Each list element can hold data of different types and sizes so it'非常通用,您可以使用*apply
函数进一步操作列表中的每个元素 . 以下示例 .使用
[[
运算符访问每个元素,如下所示:或者使用
*apply
函数对每个列表元素执行进一步操作 . 例如,要获取data2
列的平均值,您可以像这样使用sapply:偶然发现了这个答案,我实际上想要两个组(包含一个用户的数据和包含除一个用户之外的所有内容的数据) . 对于这篇文章的细节没有必要,但我想我会补充以防有人在谷歌搜索与我相同的问题 .
这是它的样子:
从版本0.8.0开始,
dplyr
提供了一个名为group_split()
的便捷功能: