【问题标题】:Replacing values randomly by taking values from another variable通过从另一个变量中获取值来随机替换值
【发布时间】:2019-11-27 20:08:20
【问题描述】:

我想用另一个变量替换一个变量的一些值(比如 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

现在假设我想用相同 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

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

【问题讨论】:

    标签: r dplyr data.table tidyverse


    【解决方案1】:

    这是我们创建行索引 ('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,并在j中进行赋值(:=

    library(data.tbale)
    setDT(data)[sample(id, 3, replace = FALSE), a := b][]
    

    【讨论】:

    • 谢谢。但我正在寻找一个通用的解决方案。另外,如果我指出该位置,则它不是随机选择的。
    • @small_lebowski 是的,我展示了 3 个选项。包括一个使用“id”列
    • @small_lebowski 更新为sample
    • sample(nrow(data), 3) 是对nrow(data) 元素中的 3 个进行采样的更紧凑的方法,尽管可能在哲学上令人反感。
    • 好的。我不知道示例功能。它适用于第一个和第三个解决方案。第二个选项是给我这样的错误“错误:案例 1 (sample(id, 3, replace = FALSE)) 的 LHS 必须是逻辑向量,而不是整数向量运行 rlang::last_error() 以查看错误发生的位置。”
    猜你喜欢
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2019-09-01
    • 1970-01-01
    相关资源
    最近更新 更多