【问题标题】:select unique combinations of some columns in R, and random value for another column选择 R 中某些列的唯一组合,以及另一列的随机值
【发布时间】:2014-06-28 14:57:00
【问题描述】:

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

我想选择 x 和 y 的唯一组合。这部分很简单,只需在前两列使用 unique 即可。但是,对于 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 命令非常慢。有没有更快的方法来做到这一点?

【问题讨论】:

  • 你试过ddply(myD, .(x, y), ...)吗?数据框的列类有哪些?

标签: r plyr


【解决方案1】:

我还没有建立数据来测试这个,但我发现dplyrplyr 快,所以这个命令:

library(dplyr)

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

应该给你更好的表现。

【讨论】:

  • 感谢您的建议。不幸的是,dplyr 需要 R 3.0,考虑到代码量,我宁愿不要冒险升级到新版本来破坏任何东西。
【解决方案2】:

由于速度在这里很重要,我建议将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

【讨论】:

    【解决方案3】:

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

    首先,随机排列行:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 2018-08-17
      相关资源
      最近更新 更多