【问题标题】:dplyr: apply different functions to different groupsdplyr:对不同的组应用不同的功能
【发布时间】:2023-03-23 12:56:01
【问题描述】:

我是一个尝试使用 dplyr 进行数据分析的初学者。我的数据基本上来自一些操作(“Ops”)并且井井有条。我经常需要根据运算的类型对观察值(“Num”)应用不同的函数,然后将它们组合起来进行分析。

简单的例子如下:

  X      Num  Ops
  0       37   S
  1       18   R
  2       11   S
  3        3   R
  4       11   S
  5       13   R
  ...     ... ...

我想根据值列“Ops”添加一个新列“Num2”,例如:

df %〉% mutate(Num2=ifelse(Ops="S",Num-1, Num+1))

我不确定我是否应该做很多ifelse 分配——感觉多余且效率低下。

必须有更好的解决方案,也许使用“group_by、select、filter”的一些组合。有什么建议吗?

基本上我想弄清楚是否有一种方法可以根据某些标准对数据进行分组,然后将不同的函数应用于不同的子集,最后将结果合并在一起。我发现的典型 dplyr 示例将相同的函数应用于所有子集。

下面的@eddi 使用 data.table 提供了更通用的解决方案。是否有 dplyr 等价物?

【问题讨论】:

  • 您可以尝试以下方法:stackoverflow.com/a/19054962/817778
  • 检查 thisthisthis 以获取想法和可能的替代技术。
  • 感谢您的建议。这些并不是我想要的。基本上我想弄清楚是否有办法根据某些标准对数据进行分组,将不同的函数应用于不同的子集,然后将结果合并在一起。典型的 dplyr 示例将相同的函数应用于所有子集。
  • @eddi 看起来您确实为 data.table 提供了更通用的解决方案。有 dplyr 等价物吗?
  • @Dong 不确定,我不是dplyr 专家

标签: r data.table dplyr


【解决方案1】:

有一个 dplyrExtras 包,其中包含一个 mutate_if 函数。

# install dplyrExtras
library(devtools)
install_github(repo="skranz/dplyrExtras")
require(dplyrExtras)
# code using mutate_if
df %>% 
  mutate(Num2 = Num+1) %>% 
  mutate_if(Ops=="S", Num2 = Num-1)

【讨论】:

  • 这似乎很浪费。在我执行 group_by(Ops) 之后,我想取消条件操作。可能吗?
【解决方案2】:

对于数字返回值,您可以轻松避免 ifelse。只需将条件转换为数值并使用适当的数值计算即可。

df %>% mutate(Num2 = Num - 2*(Ops=="S") + 1)

【讨论】:

  • 我正在寻找更通用的解决方案。函数一般比较复杂,group_by 列有两个以上的值。
猜你喜欢
  • 2017-10-05
  • 2021-07-30
  • 2021-03-12
  • 2014-04-11
  • 2013-02-22
  • 1970-01-01
  • 2021-03-16
  • 2013-03-04
  • 1970-01-01
相关资源
最近更新 更多