【问题标题】:How do I combine mutate_all and ifelse如何结合 mutate_all 和 ifelse
【发布时间】:2018-12-12 03:06:52
【问题描述】:

我想使用 mutate_all() 遍历 data.frame 的所有列,然后使用 ifelse() 有选择地更改值。

testdf <- data.frame("a"=c(1,2,3), "b"=c(4,5,6), "c"=c(7,8,9))

mutate_all(testdf, ifelse(.>9,10,.))

但这不起作用。我总是得到“对象”。未找到”。如何引用通过 mutate_all() 函数传递的各个值?我以为'。那样工作?这有效:

mutate_all(testdf, funs(.*2))

【问题讨论】:

  • 你必须像第二个例子一样传递一个函数,而不仅仅是一个表达式。请参阅?mutate_all 底部的示例,其中使用了funs()
  • mutate_all(testdf, funs(ifelse(. &gt; 9, 10, .))) 为我工作。附带说明 - 您的 testdf 中没有值 &gt; 9
  • 谢谢,那是我没有意识到的部分。我必须使用函数并且不能使用表达式。我误解了“对象”。未找到”错误。

标签: r dplyr


【解决方案1】:

尝试以下任何一种:

testdf %>% mutate_all(function(x) ifelse(x>9,10,x))

testdf %>% mutate_all(funs(ifelse(.>9,10,.)))

testdf %>% mutate_all(testdf, ~ifelse(.>9,10,.))

testdf %>% mutate_all(~ pmin(., 10))

testdf %>% mutate_all(pmin, 10)

testdf %>% mutate_all(~ replace(., . > 9, 10))

testdf %>% replace(. > 9, 10) 

最后两个来自下面的 Ronak Shah 评论。

更新

自从提出这个问题以来,dplyr 1.0.0 发布并引入了一个新的 across 函数,该函数与 mutate 一起使用,现在比 mutate_* 函数更受欢迎。

testdf %>% mutate(across(, ~ pmin(., 10)))

【讨论】:

  • 您能添加更多选项吗?似乎选择有限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多