dplyr将向量而不是单个值传递给调用的函数
我有一个这样的数据框:dplyr将向量而不是单个值传递给调用的函数,r,dplyr,R,Dplyr,我有一个这样的数据框: > df threadId threadTime 1 1 2014-07-08 18:28:29 2 1 2014-07-08 18:46:09 3 2 2014-07-10 10:14:42 4 2 2014-07-10 10:30:49 5 3 2014-07-10 11:19:27 6 3 2014-07-10 11:45:23 > str(df)
> df
threadId threadTime
1 1 2014-07-08 18:28:29
2 1 2014-07-08 18:46:09
3 2 2014-07-10 10:14:42
4 2 2014-07-10 10:30:49
5 3 2014-07-10 11:19:27
6 3 2014-07-10 11:45:23
> str(df)
'data.frame': 6 obs. of 2 variables:
$ threadId : num 1 1 2 2 3 3
$ threadTime: POSIXct, format: "2014-07-08 18:28:29" "2014-07-08 18:46:09" ...
我使用的是一个简单的函数调用(不管这个函数做什么):
我希望t1是滞后行中的时间,t2是当前行中的时间。当然,组的第一行将有NA表示滞后值,我很好,可以在函数中检查
对于t1参数,“df中的三个组”的函数调用的输出如下所示。该函数使用“lag(threadTime)”和“threadTime”的串联值调用
t1 = NA 1404858509
t1 = NA 1405001682
t1 = NA 1405005567
更新
结果表明,我的职能做什么/需要什么完全重要。更新问题。我想计算滞后行时间值之间的工作日和小时数。因此,我使用的函数如下(ONDAY是工作日,扣除周末+假期,onHours是工作时间):
workingHours这对评论来说太长了,所以我将作为答案发布
您的常规lag()
语法应该有效。我会检查您是否存在掩蔽问题,其他几个包提供了与dplyr不同的lag
函数。您可以始终显式地调用dplyr::lag
,以确保这一点
下面是一些关于内置数据的代码,以证明您的基本想法应该可行:
类似地,使用函数的修改版本:
someFunc <- function(t1, t2) { cat(t1); cat("\n"); cat(t2); cat('\n\n'); return(1)}
这是因为lag
是矢量化的,someFunc
是矢量化的,这是一件好事!它似乎与您的描述相符:
我希望t1是滞后行中的时间,t2是当前行中的时间
您可以看到滞后值(顶行)如何与当前值(底行)配对
如果这不是您想要的,请编辑您的问题以显示所需的行为,最好是在内置数据集或adput()
或模拟数据上。哦,我的天啊,我甚至没有意识到矢量化的实现使这一切变得如此高效,这是出于设计。我的需求略有不同。我会更新这个问题。这个更新来得相当晚——我没有现成的答案,我怀疑其他人会关注这个问题。我建议删除更新并提出一个新问题,该问题的顶部没有所有不相关的内容,只关注你的时间流逝问题。也就是说,我认为jeremycg在这个问题上发布的原始答案可能会起作用(或者它的一些变体)。如果您只是添加一个带有常规mutate
的滞后列,我认为您可以使用行
和您的函数来获得答案。我只是不确定。(一个预期产出的例子会有所帮助。)
t1 = NA 1404858509
t1 = NA 1405001682
t1 = NA 1405005567
workingHours <- function(t1, t2) {
elapsedTime <- seq.POSIXt(from = t1, to = t2, by = 'hour')
elapsedTime <- elapsedTime[as.Date(elapsedTime) %in% onDays &
as.numeric(format(elapsedTime, '%H')) %in%
onHours]
return(length(elapsedTime))
}
mtcars %>%
arrange(cyl, mpg) %>%
group_by(cyl) %>%
mutate(mpgmpg = paste(lag(mpg), mpg, sep = "!"))
# Source: local data frame [32 x 12]
# Groups: cyl
#
# mpg cyl disp hp drat wt qsec vs am gear carb mpgmpg
# 1 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 NA!21.4
# 2 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 21.4!21.5
# 3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 21.5!22.8
# 4 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 22.8!22.8
# 5 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 22.8!24.4
# 6 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 24.4!26
someFunc <- function(t1, t2) { cat(t1); cat("\n"); cat(t2); cat('\n\n'); return(1)}
mtcars %>% arrange(cyl, mpg) %>% group_by(cyl) %>%
mutate(mpgmpg = someFunc(lag(mpg), mpg))
# NA 21.4 21.5 22.8 22.8 24.4 26 27.3 30.4 30.4 32.4
# 21.4 21.5 22.8 22.8 24.4 26 27.3 30.4 30.4 32.4 33.9
# NA 17.8 18.1 19.2 19.7 21 21
# 17.8 18.1 19.2 19.7 21 21 21.4
# NA 10.4 10.4 13.3 14.3 14.7 15 15.2 15.2 15.5 15.8 16.4 17.3 18.7
# 10.4 10.4 13.3 14.3 14.7 15 15.2 15.2 15.5 15.8 16.4 17.3 18.7 19.2
# ...