随机使数据框中特定列上的某些行不适用

问题描述 投票:0回答:1

我想知道如何根据以下条件将

value
的行上的
name >= 2
随机替换为
NA

name
越高,
NA
的比例就越大,增量为10%

例如,如果我们将

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
"
r dataframe random tidyverse
1个回答
0
投票
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(.)

© www.soinside.com 2019 - 2024. All rights reserved.