r - 使用 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)到达了endpoint
each day
。我正在尝试随机选择endpoint
患有s = 1
. 对于每一天,id
只要之前没有选择,当天和之前几天的 s 都符合条件。以下代码得到了我的预期,但我必须手动输入day
和endpoint
值。任何有关如何直接从数据中选择这些值的建议都将不胜感激。
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
?谢谢。
解决方案
使用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
推荐阅读
- java - 访问从 TabPane 返回的 Tab 内的 JavaFX TextArea
- javascript - ResizeObserver 一对多性能
- amazon-web-services - AWS-我有一个将 Lambda 函数与 API 网关集成的 CFT。我使用哪些资源将我的 API 网关连接到自定义 DNS 名称?
- java - 如何在android中制作自定义Arrays.asList
- java - java.util.StringTokenizer.nextToken 处的线程“main”java.util.NoSuchElementException 中的异常(未知来源)
- javascript - 为什么jQuery点击功能不起作用?
- regex - Htaccess - 将旧 URL 重定向到包含旧 URL 的新 URL(即子目录)
- python-2.7 - 为什么这两个看似等效的脚本运行时间明显不同?
- ios - 在多个 AlamoFire 请求后调用 self.Class 变量
- javascript - 平面列表不维护唯一列表?