【发布时间】:2018-09-28 13:44:18
【问题描述】:
在使用 dplyr - mutate_at 时,我正在努力在我的自定义函数中传递列名。 我有一个包含数千列的数据集“dt”,我想对其中一些列执行变异,但方式取决于列名
我有这段代码
选项 1:
relevantcols = c("A", "B", "C")
myfunc <- function(colname, x) {
#write different logic per column name
}
dt%>%
mutate_at(relevantcols, funs(myfunc(<what should i give?>,.)))
我尝试以另一种方式解决问题,即通过迭代相关列并为向量的每个元素应用 mutate_at,如下所示
选项 2:
for (i in 1:length(relevantcols)){
dt%>%
mutate_at(relevantcols[i], funs(myfunc(relevantcols[i], .))
}
我在选项 2 中获得了列名,但它比选项 1 慢了 10 倍。我能以某种方式获得选项 1 中的列名吗?
添加一个例子更清楚
df = data.frame(employee=seq(1:5), Mon_channelA=runif(5,1,10), Mon_channelB=runif(5,1,10), Tue_channelA=runif(5,1,10),Tue_channelB=runif(5,1,10))
df
employee Mon_channelA Mon_channelB Tue_channelA Tue_channelB
1 1 5.234383 6.857227 4.480943 7.233947
2 2 7.441399 3.777524 2.134075 6.310293
3 3 7.686558 8.598688 9.814882 9.192952
4 4 6.033345 5.658716 5.167388 3.018563
5 5 5.595006 7.582548 9.302917 6.071108
relevantcols = c("Mon_channelA", "Mon_channelB")
myfunc <- function(colname, x) {
#based on the channel and weekday, compare the data from corresponding column with the same channel but different weekday and return T if higher else F
}
# required output
employee Mon_channelA Mon_channelB Tue_channelA Tue_channelB
1 1 T F 4.480943 7.233947
2 2 T F 2.134075 6.310293
3 3 F F 9.814882 9.192952
4 4 T T 5.167388 3.018563
5 5 F T 9.302917 6.071108
【问题讨论】:
-
您能否举一个“每列名称不同的逻辑”的具体示例,所以我们有一个示例函数可以使用?拥有一个示例数据集以及您想要的输出也将有所帮助。您可以看到有关如何制作可重现示例的想法here。
-
完成,希望对了解情况有所帮助
-
我不清楚你想要的输出的部分逻辑。对于星期一,您想要真/假值,但对于星期二,您想要与星期二对应的值?为什么不全是真/假或全是数字?
-
@camille 你是对的。最后,所有值都将是布尔值或数字。所以星期二的值必须与星期三的值进行比较,周末有一些例外等等......我只是想解释一下将列名传递给 myfunc 的要求......注意在原始数据集中,我有 5000 多个列,包含各种渠道和工作日组合。