【发布时间】:2014-05-20 21:24:10
【问题描述】:
我在 R 中有一个包含 2 列的大型数据框(下面有 a 和 b 的样本)。
set.seed(12);n =5;n_a=5;n_b=5
id_lengths = sample(1:n,n_a,replace=T)
a = rep(1:n_a,id_lengths)
b = sample(1:n_b,length(a),replace =T)
data = data.frame(a = a,b = b)
我想为每个“a”在“a”列中获取唯一值的排序向量。该向量应根据“b”列按最大重叠排序。我正在使用下面的代码来实现结果。
get_similar_ids = function(z){
tmp = sapply(a_list,FUN = function(z1){length(intersect(z1,z))})
sort(tmp,decreasing=T)
}
a_list = split(data$b,data$a)
lapply(a_list,FUN=get_similar_ids)
结果:
$`1`
1 2 3 4 5
1 1 0 0 0
$`2`
2 1 3 5 4
3 1 1 1 0
$`3`
3 2 4 1 5
3 1 1 0 0
$`4`
3 4 1 2 5
1 1 0 0 0
$`5`
2 5 1 3 4
1 1 0 0 0
问题是实际数据有很大的 n_a (~1700000)、n_b (~250000) 和 n(~15) 导致数据行数超过 1300 万行,对于这么大的代码根本无法复制价值观。 任何想法如何加快这些操作??
【问题讨论】:
-
您描述了“我想为每个“a”获取“a”列中唯一值的排序向量。您的数据只有一行
a == 1,但您的第一个列表元素包含 1 和 2 的条目。这是正确的吗?如果没有,那么您可以进一步简化 James 的解决方案。 -
是的,1 和 2 都应该在第一个列表元素中有条目,因为 a==1 和 a==2 有 1 个公共 b (b=1)。
标签: r performance loops lapply