r - 如何在每个值的条件下 mutate_at 多列?

标签 r dplyr

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

我可以对这些小时值进行收集(然后展开),但在大数据帧上收集似乎非常慢。 我也可以对所有 24 列进行相同的变异,但当 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

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

最佳答案

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

关于r - 如何在每个值的条件下 mutate_at 多列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57329163/

相关文章:

R 从一个变量创建矩阵

r - 使用 Shinytest 测试可编辑的 DT

r - 通过应用多列函数聚合表

r - 如何在 dplyr mutate 中使用由列遮蔽的变量

r - 如何在向量的每个值之间写一个逗号?

r - 添加一行,其中包含列的总和和平均值

r - 获取 R 列表中除最后一项之外的所有项

r - 在 dplyr 链中添加边距行总计

r - 有没有办法将 `across` 与 `group_by` 和 `mutate` 一起使用?

rownames_to_column 在 rowwise() 正确后不起作用