【问题标题】:r - use dplyr to mutate column 2 if column 1 equalsr - 如果第 1 列等于,则使用 dplyr 来改变第 2 列
【发布时间】: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 - 大写只是我在中途更改示例而不是彻底,你是对的 - 大写不正确。

标签: r dplyr


【解决方案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 有一个诱人的名字,但该谓词 AFAIK 仅适用于列,而不适用于行。

【讨论】:

  • 这里只需要 dplyr。编辑。
  • 嗯,是的,但现在我不得不理解 case_when 是如何工作的!谢谢你。我还意识到了另一种方法,并编辑了我的示例。
猜你喜欢
  • 2017-11-21
  • 2016-11-14
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
相关资源
最近更新 更多