通过从另一个变量中取值来随机替换值

sma*_*ski 3 r dplyr data.table tidyverse

我想从另一个变量中替换一个变量的一些值(比如 10 个中的 3 个值)。选择必须是随机的,并且必须保持相同的 id。

这是一个示例数据,

id <- c(seq(1:10))
a <- c(11, 22, 33, 44, 55, 66, 77, 88, 99, 109)
b <- c(111, 222, 333, 444, 555, 666, 777, 888, 999, 1099)
data <- data.frame(id, a, b)
data

> data
   id   a    b
1   1  11  111
2   2  22  222
3   3  33  333
4   4  44  444
5   5  55  555
6   6  66  666
7   7  77  777
8   8  88  888
9   9  99  999
10 10 109 1099
Run Code Online (Sandbox Code Playgroud)

现在假设我想用相同 ID 下的变量 b 中的值替换变量 a 中的 3 个值。一个示例输出可能是,

> data
   id    a    b
1   1   11  111
2   2   22  222
3   3  333  333
4   4   44  444
5   5   55  555
6   6  666  666
7   7   77  777
8   8   88  888
9   9   99  999
10 10 1099 1099
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我做到这一点?Tidy 或 data.table 两种解决方案都很好。

akr*_*run 5

这是我们创建sample行索引('i1')的一个选项,用于将'b'的值分配给'a'base R

i1 <- sample(seq_len(nrow(data)), 3, replace = FALSE)
data$a[i1] <- data$b[i1]
Run Code Online (Sandbox Code Playgroud)

或 with dplyr,创建一个条件 withrow_number()并在case_when( ifelseor if_elseor replace) 中使用该条件将 'a' 中的值更改为 'b' 中的值

library(dplyr)
data %>%
    mutate(a = case_when(row_number() %in% 
                   sample(id, 3, replace = FALSE) ~ b, TRUE ~ a))
Run Code Online (Sandbox Code Playgroud)

或 with data.table,将 'data.frame' 转换为 'data.table' ( setDT),指定iwith 数字索引,并在中进行赋值 ( :=)j

library(data.tbale)
setDT(data)[sample(id, 3, replace = FALSE), a := b][]
Run Code Online (Sandbox Code Playgroud)