我想知道如何根据以下条件将
value
的行上的 name >= 2
随机替换为 NA
:
越高,name
的比例就越大,增量为10%。NA
例如,如果我们将
NA
的 10% 的 value
放在 name==2
上,那么,我预计 value
上 name==3
的 20%会被
NA
替换,并且等等。
这在 R 中可能吗?
library(tidyverse)
set.seed(0)
map_dfc(1:3, \(i) round(rbeta(5, i+.1, i+12, i*.2),2)) %>%
pivot_longer(everything()) %>%
mutate(name=as.numeric(str_remove(name, "...")))
"
name value
<dbl> <dbl>
1 1 0.01
2 2 0.17
3 3 0.31
4 1 0.1
5 2 0.02
6 3 0.17
7 1 0.01
8 2 0.16
9 3 0.17
10 1 0.1
11 2 0.27
12 3 0.22
13 1 0.24
14 2 0.08
15 3 0.06
"
library(dplyr)
firstprob <- 0.1
set.seed(42)
distinct(quux, name) |>
mutate(prob = firstprob + 0.1 * (row_number() - 1)) |>
right_join(quux, by = "name") |>
mutate(value = if_else(row_number() %in% sample(n(), size = ceiling(first(prob) * n())), value[NA], value), .by = name)
# # A tibble: 15 × 3
# name prob value
# <dbl> <dbl> <dbl>
# 1 1 0.1 NA
# 2 1 0.1 0.1
# 3 1 0.1 0.01
# 4 1 0.1 0.1
# 5 1 0.1 0.24
# 6 2 0.2 0.17
# 7 2 0.2 0.02
# 8 2 0.2 0.16
# 9 2 0.2 0.27
# 10 2 0.2 NA
# 11 3 0.3 NA
# 12 3 0.3 0.17
# 13 3 0.3 0.17
# 14 3 0.3 0.22
# 15 3 0.3 NA
我们首先减少到唯一的
name
,从第一个到其余的分配(NA
)的比例,连接回原始数据,然后根据 prob
行比例内的行号进行替换每组。
这是使用
.by=
所以需要 dplyr_1.1.0
;如果较旧,请将 .by=
替换为适当使用的 group_by(.)
。