首页 > 解决方案 > 使用 sample_n 随机选择 R 中的行

问题描述

df <- data.frame(
  id = c(1:12), 
  day = c(1, 1, 1,1, 2, 2,2, 2, 3,3,3,3), 
  endpoint = c(1, 1, 1,1, 2,2,2,2,1,1,1,1))  
df
#>    id day endpoint
#> 1   1   1        1
#> 2   2   1        1
#> 3   3   1        1
#> 4   4   1        1
#> 5   5   2        2
#> 6   6   2        2
#> 7   7   2        2
#> 8   8   2        2
#> 9   9   3        1
#> 10 10   3        1
#> 11 11   3        1
#> 12 12   3        1

在上述数据中,有一些患者(id)到达了endpointeach day。我正在尝试随机选择endpoint患有s = 1. 对于每一天,id只要之前没有选择,当天和之前几天的 s 都符合条件。以下代码得到了我的预期,但我必须手动输入dayendpoint值。任何有关如何直接从数据中选择这些值的建议都将不胜感激。

library(dplyr)
df$s = 0 
df$s <-ifelse(df$id%in%sample_n(df[df$day<=1 & df$s==0, ], 1)$id, 1, df$s) 
df$s <-ifelse(df$id%in%sample_n(df[df$day<=2 & df$s==0, ], 2)$id, 1, df$s) 
df$s <-ifelse(df$id%in%sample_n(df[df$day<=3 & df$s==0, ], 1)$id, 1, df$s) 
df
#>    id day endpoint s pick_day 
#> 1   1   1        1 0 0
#> 2   2   1        1 1 2
#> 3   3   1        1 1 1
#> 4   4   1        1 1 3
#> 5   5   2        2 1 2
#> 6   6   2        2 0 0
#> 7   7   2        2 0 0
#> 8   8   2        2 0 0
#> 9   9   3        1 0 0
#> 10 10   3        1 0 0
#> 11 11   3        1 0 0
#> 12 12   3        1 0 0

编辑

是否可以添加一个变量来显示选择day了哪一行,就像上面的变量一样pick_day?谢谢。

标签: rdplyr

解决方案


使用for循环的基础 R 中的一种方法:

df$s = 0 
set.seed(123)

for (i in unique(df$day)) {
   temp <- subset(df, day <= i & s == 0)
   ids <- with(temp, sample(id, endpoint[day == i][1]))
   df$s[df$id %in% ids] <- 1
}

df

#   id day endpoint s
#1   1   1        1 0
#2   2   1        1 0
#3   3   1        1 1
#4   4   1        1 1
#5   5   2        2 1
#6   6   2        2 0
#7   7   2        2 0
#8   8   2        2 1
#9   9   3        1 0
#10 10   3        1 0
#11 11   3        1 0
#12 12   3        1 0

推荐阅读