【问题标题】:How to mutate_at multiple columns on a condition on each value?如何在每个值的条件下对多个列进行mutate_at?
【发布时间】:2019-08-02 15:07:51
【问题描述】:

我有一个超过 100 万行的数据框,以及一天中每个小时的一列。我想改变这些列中的每个值,但该修改取决于值的符号。 我怎样才能有效地做到这一点?

我可以对这些每小时值进行收集(然后传播),但在大数据帧上收集似乎相当慢。 我也可以在所有 24 列上执行相同的 mutate,但是当 mutate_at 看起来能够做到这一点时,这似乎不是一个很好的解决方案。

我可能不得不在不久的将来再次进行这种变异,我希望找到比重复、无聊的代码更好的东西。

df = data.table(
    "ID" = c(1,1,1,2,2), #Should not be useful there
    "Date" = c(1,2,3,1,2), #Should not be useful there
    "total_neg" = c(1,1,0,0,2),
    "total_pos" = c(4,5,2,4,5),
    "H1" = c(5,4,0,5,-5),
    "H2" = c(5,-10,5,5,-5),
    "H3" = c(-10,6,5,0,10)
)

我想申请类似的东西

df%>%
  mutate_at(c("H1", "H2", "H3"), FUN(ifelse( Hour < 0, Hour*total_neg/10, Hour*total_pos/10)))

Hour 是每列中的值。正如所写的那样,它显然不起作用,“。”也不起作用。但我正在寻找意味着“我们在 mutate_at 中选择的列中的任何值”

如果有帮助,我目前正在使用存储在两列中的每个实际正值和负值的总和对一些值进行非规范化。

在我的示例中,这将是预期的结果:

df = data.table(
    "ID" = c(1,1,1,2,2),
    "Date" = c(1,2,3,1,2),
    "total_neg" = c(1,1,0,0,2),
    "total_pos" = c(4,5,2,4,5),
    "H1" = c(2,2,0,2,-1),
    "H2" = c(2,-1,1,2,-1),
    "H3" = c(-1,3,1,0,5)
)
df

提前感谢您提供的任何帮助,我必须为我的错误道歉,但作为非本地人,我向您保证我会尽力而为!

【问题讨论】:

  • 应该是list(~ 而不是FUN

标签: r dplyr


【解决方案1】:

FUN 不是mutate_at 中的参数。在新版本中,早期使用的fun 已弃用为list(~ 或简单的~。此外,将要选择的列包装在vars 中。它也可以不加引号或使用vars(starts_with("H"))vars(matches("^H\\d+$"))。另外,将“小时”替换为.

library(dplyr)
df %>%
    mutate_at(vars(c("H1", "H2", "H3")), ~ifelse( . < 0, 
           .*total_neg/10, .*total_pos/10))
#. ID Date total_neg total_pos H1 H2 H3
#1  1    1         1         4  2  2 -1
#2  1    2         1         5  2 -1  3
#3  1    3         0         2  0  1  1
#4  2    1         0         4  2  2  0
#5  2    2         2         5 -1 -1  5

【讨论】:

  • 非常感谢!有用 !我会尽快接受你的回答。再次感谢这个使用“starts_with”的建议,它将使代码更好地阅读!我基本上是在一个月前写了我的第一行 R,而且很难习惯它的编写方式以及这一切的含义。你能解释一下 FUN 和 list 是什么意思吗?为什么现在列表更好?
  • @FBiggio。关于您的问题,传递匿名函数是一个整洁的环境。你可以简单地做function(x) x,它类似于~,为什么fun被弃用应该在dplyr的一些github问题页面中。我有一种感觉,他们想概括一个函数,但不确定
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2017-04-24
相关资源
最近更新 更多