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 两种解决方案都很好。
这是我们创建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)