选择R中某些列的唯一组合,以及另一列的随机值

时间:2014-05-11 04:14:08

标签: r plyr

假设我有一个数据框myD,其中包含以下列:x,y,a,b。

我想选择x和y的唯一组合。这部分很简单,只需在前两列使用唯一。但是,对于x,y的每个唯一组合,有a和b的多个值;我想选择一个随机行。即,在匹配x,y的特定组合的所有行中,我只想随机选择其中一行。请注意,我不想独立采样a和b;他们应该来自同一排。

我正在使用ddply来执行此操作:

ddply(myD, c("x","y"), summarize,
        a=a[1],
        b=b[1])

这当然得到x,y的每个组合的第一对a,b;我随机排列整个数据框以实现一致性。

无论如何,当数据帧有一百万行或更多行时,这个ddply命令非常慢。有更快的方法吗?

3 个答案:

答案 0 :(得分:0)

由于速度很重要,我建议将data.table包和sample函数组合使用。 data.table plyr可以执行许多相同的事情#Make fake data set.seed(3) myD <- data.frame(x=c("s","s","s","t","t","t"),y=c("u","u","v","v","w","w"), a=rnorm(6),b=rnorm(6)) #See data myD # x y a b # 1 s u -0.96193342 0.08541773 # 2 s u -0.29252572 1.11661021 # 3 s v 0.25878822 -1.21885742 # 4 t v -1.15213189 1.26736872 # 5 t w 0.19578283 -0.74478160 # 6 t w 0.03012394 -1.13121857 require("data.table") myD <- data.table(myD) myD[,rand.row:=sample(1:.N,1),by=c("x","y")] myD <- myD[,list(a=a[rand.row],b=b[rand.row]),by=c("x","y","rand.row")] myD # x y rand.row a b # 1: s u 1 -0.96193342 0.08541773 # 2: s v 1 0.25878822 -1.21885742 # 3: t v 1 -1.15213189 1.26736872 # 4: t w 2 0.03012394 -1.13121857 可以做得更快。这样的事可能有用......

{{1}}

答案 1 :(得分:0)

我还没有构建数据来测试它,但我发现dplyr要比plyr快,所以这个命令:

library(dplyr)

df_sampled <- myD %.%
group_by(x, y) %.% 
summarize(a = a[1], b = b[1])

应该给你更好的表现。

答案 2 :(得分:0)

我想出了一个快速而简单的解决方案。

首先,随机置换行:

myD <- myD[sample(1:dim(myD)[1],replace=FALSE),]

接下来,仅为x和y的每个唯一组合保留第一行:

myD <- myD[!duplicated(myD[,c("x","y")]),]