在 R 中有效地替换多个值并保持其他值相同

标签 r tidyverse dplyr

我有一个如下所示的数据框:

combo_2  combo_4  combo_7  combo_9
12       23       14       17
21       32       41       71
2        3        1        7
1        2        4        1
21       23       14       71
2        32       1        7

每列都有两个个位数值和两个由个位数值按每种可能的顺序组成的两位数值。

我正在尝试确定如何替换数据框中的某些值,以便只有一个版本的两位数值。例如,第一列中 21 的所有值应为 12。第二列中 32 的所有值应变为 23。

我知道我可以使用以下代码执行类似的操作:

df <- df %>%
    mutate_at(vars(combo_2, combo_4, combo_7, combo_9), function(x)
    case_when(x == 21 ~ 12, x == 32 ~ 23, x == 41 ~ 14, x == 71 ~ 17))

这样做的问题是,它给了我一个数据帧,其中指定时包含正确的值,但将所有其他值保留为 NA。生成的数据帧仅包含 21、32、41 和 71 所在的值。我知道我可以通过指定每个值来解决这个问题,例如 x == 1 ~ 1。但是,我有很多值,并且更愿意只指定我要更改的值。

如何替换数据框中的多个值而不使所有其他值变为 NA?有没有办法让我替换我想要替换的值,同时保持其他值相同,而不直接指定这些值?

最佳答案

您可以在 case_when() 序列末尾使用 TRUE ~ x:

df %>%
  mutate_at(vars(combo_2, combo_4, combo_7, combo_9), function(x)
    case_when(x == 21 ~ 12, x == 32 ~ 23, x == 41 ~ 14, x == 71 ~ 17, TRUE ~ x))

  combo_2 combo_4 combo_7 combo_9
1      12      23      14      17
2      12      23      14      17
3       2       3       1       7
4       1       2       4       1
5      12      23      14      17
6       2      23       1       7

另一个可能更高效的选项是 data.table 的 fcase() 函数。

数据:

df = read.table(header = TRUE, text = "combo_2  combo_4  combo_7  combo_9
12       23       14       17
21       32       41       71
2        3        1        7
1        2        4        1
21       23       14       71
2        32       1        7")

df[] = lapply(df, as.double) # side-note: tidyverse has become very stict about types

关于在 R 中有效地替换多个值并保持其他值相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64452568/

相关文章:

r - 如何知道 R 中的文本文件中缺少哪一行(日期)?

r - 使用定额在自定义函数中调用公式

r - 将数据框列从字符转换为数字

r - 将单元格中的列表取消列出到单独的列中 - 错误

r - 在 r 中将 2 列(从长形式转换为宽形式)扩展为 4 列

r - 函数的函数总是返回 0-R

json - R:将特定行转换为列

r - 有关如何使用 for 循环比较列和向量输入的建议

r - 将 dplyr::across 与两组变量一起使用

r - 如何按组获取汇总统计数据