假设我有一个数据框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命令非常慢。有更快的方法吗?
答案 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")]),]