【发布时间】:2019-06-10 21:44:03
【问题描述】:
我正在尝试使用 dplyr 根据 column1 的内容对数据框的 column2 进行变异(或 mutate_if?)。
ID TEST PREF
11 true blue
23 false red
4 false yellow
如果 test == "false",我想改变 PREF = "orange"。否则,请勿更改 PREF。
ID TEST PREF
11 true blue
23 false orange
4 false orange
我认为 ifelse 语句可能有效,但不明白如何让 else 什么也不做。它似乎返回列号而不是该行的内容。
df <- data.frame(ID = c("11", "23", "4"),
TEST = factor(c("true", "false", "false")),
PREF = factor(c("blue", "red", "yellow")))
df <- df %>%
mutate(PREF = ifelse(TEST == "false", "orange", PREF))
我觉得 mutate_if 应该是合适的,但我认为我不太了解它的功能,我找不到任何类似于我需要的示例。比如:
df <- df %>%
mutate_if(TEST == "true", PREF = "orange")
谁能给我一些建议?谢谢!
编辑:
我意识到,在我的 ifelse 语句中,它返回的是因子的级别,而不是我想要的字符。通过指定 as.character,这完全符合我的期望。
df2 <- df %>%
mutate(PREF = factor(ifelse(TEST == "false", "white", as.character(PREF))))
【问题讨论】:
-
我认为您可能只是在大小写方面遇到了麻烦。如果您将
test更改为TEST并将pref更改为PREF,您的第一次尝试应该会成功。 R 区分大小写。 -
mutate_if不是正确的函数。该命令的if部分查看列本身的属性,而不是任何特定的行值。您可以使用mutate_if更改所有数字列或字符,或在缺少值的列中插入数据。ifelse是更好的选择(请注意您发布的代码有什么问题),另请参阅“整洁”名为if_else的版本甚至是基本函数replace()可能是更好的选择。 -
感谢@joshpk - 大写只是我在中途更改示例而不是彻底,你是对的 - 大写不正确。