我有一个超过一百万行的数据框,并且每天每小时都有一列。我想对那些列中的每个值进行突变,但是这种修改取决于该值的符号。我如何有效地做到这一点?
我可以对这些小时值(然后进行传播)进行收集,但是在大数据帧上收集似乎很慢。我也可以在所有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)
)
Run Code Online (Sandbox Code Playgroud)
我想应用类似
df%>%
mutate_at(c("H1", "H2", "H3"), FUN(ifelse( Hour < 0, Hour*total_neg/10, Hour*total_pos/10)))
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
在此先感谢您提供的任何帮助,对于我的错误,我必须深表歉意,但是作为非母语人士,我向您保证我会尽力而为!
在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
Run Code Online (Sandbox Code Playgroud)