【问题标题】:filter and unfilter in dplyr在 dplyr 中过滤和取消过滤
【发布时间】:2016-07-26 20:01:13
【问题描述】:

在基础 R 中执行以下操作的 dplyr 模拟是什么?

iris$Sepal.Length[iris$Sepal.Length>2] <- iris$Sepal.Length[iris$Sepal.Length>2] * 10

我正在尝试使用过滤器,但无法返回原始数据集(没有join

【问题讨论】:

  • mutateifelse,例如iris %&gt;% mutate(Sepal.Length = ifelse(Sepal.Length &gt; 2, Sepal.Length * 10, Sepal.Length))
  • 多年来一直在使用 dplyr,但我自己还没有弄清楚这一点。有一个 dplyr 扩展库可以实现这一点,但这显然不能令人满意。
  • @alistaire 你想回答吗?你先想出来。如果你愿意,我可以删除我的。
  • 呃,同一时间;没关系
  • @Sumedh 这效率太低了,不是吗?

标签: r dplyr


【解决方案1】:

您可以使用mutateifelse 来获得与来自@alistaire 的cmets 相同的结果:

iris %>% mutate(Sepal.Length = ifelse(Sepal.Length > 2, Sepal.Length * 10, Sepal.Length))

【讨论】:

  • 很好的答案,但不知何故不能令人满意。我真的很想念mutate_if
  • @KonradRudolph 以前没有真正使用过该功能。可能是更好的解决方案。我想知道这是否是列条件,即用于选择列的谓词。
  • 这就是重点:函数doesn’t exist (in dplyr)(dplyr 5.0 确实引入了同名的函数,但它令人费解且令人讨厌地做了一些不同的事情)。
  • dplyr 目前有if_else 功能,这很像base::ifelse,但提供了更强的打字功能。
【解决方案2】:

如果我们使用data.table,我们可以避开ifelse,让它更快

library(data.table)
as.data.table(iris)[Sepal.Length > 2, Sepal.Length := Sepal.Length * 10]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2016-06-28
    • 1970-01-01
    相关资源
    最近更新 更多