我有一个如下所示的数据框:
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/