按条件 (r) 分组抽样

Sample by groupy with a condition (r)

我需要为每个人 (id) 随机 select 一本日记,但仅限于那些填写了不止一个的人。

假设我的数据是这样的

dta = rbind(c(1, 1, 'a'), 
      c(1, 2, 'a'), 
      c(1, 3, 'b'), 
      c(2, 1, 'a'), 
      c(3, 1, 'b'), 
      c(3, 2, 'a'), 
      c(3, 3, 'c'))

colnames(dta) <- c('id', 'DiaryNumber', 'type')
dta = as.data.frame(dta)
dta

  id     DiaryNumber type
  1             1    a
  1             2    a
  1             3    b
  2             1    a
  3             1    b
  3             2    a
  3             3    c

比如id 1写了3篇日记。我需要的是随机 select 3 篇日记中的一篇。 Id 2 只写了一本日记,所以我不需要用它做任何事情。

我不知道我该怎么做。 有任何想法吗 ?

您可以使用 sample_n:

library(dplyr)
dta %>% group_by(id) %>% sample_n(1)
## Source: local data frame [3 x 3]
## Groups: id
## 
##   id DiaryNumber type
## 1  1           2    a
## 2  2           1    a
## 3  3           1    b

基础包:

set.seed(123)
df <- lapply(split(dta, dta$id), function(x) x[sample(nrow(x), 1), ])
do.call("rbind", df) 

输出:

  id DiaryNumber type
1  1           1    a
2  2           1    a
3  3           2    a