【发布时间】:2019-04-26 14:47:58
【问题描述】:
数据:
data <- structure(list(index = c(1, 2, 3, 4, 5, 6),
hour = c(13, 13, 13, 1, 1, 1), minutes = c(31,
31, 32, 36, 36, 36)), class = "data.frame", row.names = c(1067L,
1069L, 1070L, 1072L, 1073L, 1074L))
使用do.call:
func <- function(hourFilt, minutesFilt){
filt <- data[data$hour == hourFilt & data$minutes == minutesFilt, ]$idx
sum(filt)
}
do.call(func, list(hourFilt = 1:5, minutesFilt = 31:35))
我知道警告的含义:
警告信息: 1:在 data$hour == hourFilt 中: 较长的对象长度不是较短对象长度的倍数
但我希望该函数被调用五次,而不仅仅是一次,从而导致警告和错误结果。
预期结果:
mapply(func, hourFilt = 1:5, minutesFilt = 31:35)
1 2 0 0 0
不过,我更喜欢使用do.call(),因为它更快。
编辑:添加意图
我想在特定时间过滤 25k-200k 行的数据集。对原始数据集的过滤将产生三行。对于这个结果,我想总结一个给定的变量 - 这里:索引。该过程将重复数百次。因此,我查看了mapply()、do.call()。性能确实很重要,这就是为什么我更喜欢do.call()。
【问题讨论】:
-
如果没有人看过你的代码,你会如何描述你的意图?请进行编辑以更明确地反映预期输出。
-
当然,看我的编辑。
-
如果我运行你的函数,然后像
mapply(func, hourFilt = 1:5, minutesFilt = 31:35)一样使用mapply,我会在你的data上得到全0,这是有道理的,因为对于第一种情况data$index[data$hour == 1 & data$minutes == 31]返回numeric(0)。你怎么得到 1? -
我不确定说
do.call是否“更快”是公平的,因为它们做的事情完全不同。do.call()只会使用一组参数调用一次函数。您似乎想使用不同的参数多次调用一个函数。这些是非常不同的操作。我不确定do.call是否按照您的想法行事。