Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr将向量而不是单个值传递给调用的函数_R_Dplyr - Fatal编程技术网

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是当前行中的时间

您可以看到滞后值(顶行)如何与当前值(底行)配对


如果这不是您想要的,请编辑您的问题以显示所需的行为,最好是在内置数据集或a
dput()
或模拟数据上。

哦,我的天啊,我甚至没有意识到矢量化的实现使这一切变得如此高效,这是出于设计。我的需求略有不同。我会更新这个问题。这个更新来得相当晚——我没有现成的答案,我怀疑其他人会关注这个问题。我建议删除更新并提出一个新问题,该问题的顶部没有所有不相关的内容,只关注你的时间流逝问题。也就是说,我认为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
# ...