组内随机选择

时间:2015-01-22 19:51:52

标签: r

你好,我希望这不是一个重复的问题,但可能是一个非常简单的问题。我找不到答案,我不能自己解决。

我有一个类似下面的数据框,我需要在每个“id_lote”中随机选择一行。 “id_pix”是唯一的,但重复“id_lote”并且组(id_lote)的大小不同。我的结果应该是一个子集数据帧,其中许多行作为id_lote但随机选择。我正在使用示例命令进行其他随机选择但我无法使其适用于此问题。如果我使用唯一命令它不会是一个随机子集... 提前谢谢!

id_pix id_lote clase   f1   f2
45       4      Sg    2460 2401
46       4      Sg    2620 2422
47       4      Sg    2904 2627
48       5      M     2134 2044
49       5      M     2180 2104
50       5      M     2127 2069
83      11      S     2124 2062
84      11      S     2189 2336
85      11      S     2235 2162
86      11      S     2162 2153
87      11      S     2108 2124

3 个答案:

答案 0 :(得分:3)

只有基数R,您可以使用ave例如:

> DF[!!ave(seq_along(DF$id_lote), DF$id_lote, FUN=function(x) sample(x, 1) == x),]
#id_pix id_lote clase   f1   f2
#3     47       4    Sg 2904 2627
#6     50       5     M 2127 2069
#7     83      11     S 2124 2062

或者使用dplyr,您可以使用sample_n

library(dplyr)
> DF %>% group_by(id_lote) %>% sample_n(1)
#Source: local data frame [3 x 5]
#Groups: id_lote
#
#id_pix id_lote clase   f1   f2
#1     46       4    Sg 2620 2422
#2     48       5     M 2134 2044
#3     85      11     S 2235 2162

答案 1 :(得分:2)

data.table在这里效果很好

library(data.table)
setDT(data) #Convert data to a data.table

data[, .SD[sample(1:.N,1)], by=.(id_lote)]

答案 2 :(得分:1)

within(df[sample(1:nrow(df), size = nrow(df)), ], !duplicated(id_lote))