【发布时间】:2011-11-24 01:45:20
【问题描述】:
我有一个聚合问题,我无法弄清楚如何在 R 中有效地执行。
假设我有以下数据:
group1 <- c("a","b","a","a","b","c","c","c","c",
"c","a","a","a","b","b","b","b")
group2 <- c(1,2,3,4,1,3,5,6,5,4,1,2,3,4,3,2,1)
value <- c("apple","pear","orange","apple",
"banana","durian","lemon","lime",
"raspberry","durian","peach","nectarine",
"banana","lemon","guava","blackberry","grape")
df <- data.frame(group1,group2,value)
我有兴趣从数据框df 中进行抽样,这样我会从group1 和group2 的每个因子组合中随机选择一行。
如你所见,table(df$group1,df$group2)的结果
1 2 3 4 5 6
a 2 1 2 1 0 0
b 2 2 1 1 0 0
c 0 0 1 1 2 1
表明某些组合出现了不止一次,而另一些则从未见过。对于那些被多次看到的(例如,group1="a" 和group2=3),我只想随机选择一个相应的行并返回一个只有该行子集的新数据框。这样,分组因子的每个可能组合仅由数据框中的一行表示。
这里的一个重要方面是,我的实际数据集可以包含从 500,000 行到 >2,000,000 行的任何地方,因此请务必注意性能。
我在 R 方面相对较新,所以我一直无法弄清楚如何正确生成这个结构。一次尝试看起来像这样(使用plyr 包):
choice <- function(x,label) {
cbind(x[sample(1:nrow(x),1),],data.frame(state=label))
}
df <- ddply(df[,c("group1","group2","value")],
.(group1,group2),
pick_junc,
label="test")
请注意,在这种情况下,我还在数据框中添加了一个名为“label”的额外列,该列被指定为ddply 函数的额外参数。但是,我在大约 20 分钟后杀死了它。
在其他情况下,我尝试过使用aggregate 或by 或tapply,但我永远不知道指定的函数得到了什么,它应该返回什么,或者如何处理结果(尤其是对于by)。
我正在尝试从 python 切换到 R 以进行探索性数据分析,但这种类型的聚合对我来说至关重要。在 python 中,我可以非常快速地执行这些操作,但这很不方便,因为我必须为要执行的每种不同类型的聚合生成单独的脚本/数据结构。
我想爱 R,所以请帮忙!谢谢!
乌里
【问题讨论】:
-
数据框这么大,看包
data.table,挺快的
标签: r dataframe plyr aggregation