r-如果列1等于,请使用dplyr更改列2

时间:2019-06-10 21:44:03

标签: r dplyr mutate

我试图基于列1的内容使用dplyr更改(或mutate_if?)数据框的列2。

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))))

1 个答案:

答案 0 :(得分:1)

您正在努力!但是,必须确保您的字符列未转换为因数。我不完全理解为什么if_else()的因子水平失败,但是至少下面的适应代码可以满足我的要求。 stringsAsFactors与以往一样重要。

library(dplyr)

df <- data.frame(ID = c("11", "23", "4"),
                 myTEST = c("true", "false", "false"),
                 myPREF = c("blue", "red", "yellow"), stringsAsFactors=F)

new_df <- df %>%
  mutate(myPREF = case_when(myTEST=="false" ~ "orange",
                          TRUE ~ myPREF))

str(new_df)

mutate_if有一个吸引人的名称,但该谓词仅对列有效,对行不起作用。