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

时间:2019-11-27 20:08:20

标签: r dplyr data.table tidyverse

我想从另一个变量替换某个变量的某些值(例如,十分之三)。选择内容必须是随机的,并且必须保持相同的ID。

这是一个示例数据,

C_ID    Loan_ID Loan    R1  Coll_ID Collateral  R2  maxRank
A       c       341     1       p1  506         1   3
A       c       341     1       p2  366         2   3
A       c       341     1       p3  263         3   3
A       a       689     2       p1  506         1   3
A       a       689     2       p2  366         2   3
A       a       689     2       p3  263         3   3
A       d       720     3       p1  506         1   3
A       d       720     3       p2  366         2   3
A       d       720     3       p3  263         3   3
A       b       334     4       p1  506         1   3
A       b       334     4       p2  366         2   3
A       b       334     4       p3  263         3   3
A       e       752     5       p1  506         1   3
A       e       752     5       p2  366         2   3
A       e       752     5       p3  263         3   3
B       h       193     1       p5  529         1   2
B       h       193     1       p4  414         2   2
B       g       494     2       p5  529         1   2
B       g       494     2       p4  414         2   2
B       f       227     3       p5  529         1   2
B       f       227     3       p4  414         2   2
B       j       785     4       p5  529         1   2
B       j       785     4       p4  414         2   2
B       i       371     5       p5  529         1   2
B       i       371     5       p4  414         2   2
B       k       395     6       p5  529         1   2
B       k       395     6       p4  414         2   2

现在让我们说我想用相同id下的变量b中的值替换变量a中的3个值。一个示例输出可能是

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

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

1 个答案:

答案 0 :(得分:2)

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

i1 <- sample(seq_len(nrow(data)), 3, replace = FALSE)
data$a[i1] <- data$b[i1]

或者使用dplyr,使用row_number()创建一个条件,并在case_whenifelseif_elsereplace)中使用该条件进行更改从“ a”到“ b”的值

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

或者使用data.table,将'data.frame'转换为'data.table'(setDT),用数字索引指定i,然后进行赋值({{ 1}})在:=

j