在dplyr mutate中使用seq函数

在dplyr mutate中使用seq函数,r,dplyr,R,Dplyr,我试图计算dplyr::mutate中两个日期之间的月数,但遇到了错误 Error in mutate_impl(.data, dots) : 'from' must be of length 1 关于seq是否有与mutate不兼容的地方 library(dplyr) dset <- data.frame( f = as.Date(c("2016-03-04","2016-12-13","2017-03-01")) , o = as.Date

我试图计算
dplyr::mutate
中两个日期之间的月数,但遇到了错误

 Error in mutate_impl(.data, dots) : 'from' must be of length 1
关于
seq
是否有与
mutate
不兼容的地方

library(dplyr)
dset <- data.frame( f = as.Date(c("2016-03-04","2016-12-13","2017-03-01")) , 
                    o = as.Date(c("2016-03-04","2016-12-13","2017-06-02")) )
dset %>% mutate( y = length(seq(from=f, to=o, by='month')) - 1 )
库(dplyr)
数据集%变异(y=长度(从=f到=o,按月计算)-1)

您可能还需要使用
dplyr
来执行以下操作:

dset <- data.frame( f = as.Date(c("2016-03-04","2016-12-13","2017-03-01")) , 
                    o = as.Date(c("2016-03-04","2016-12-13","2017-06-02")) )

dset %>% mutate( y = as.numeric(difftime(f,o, units = "weeks"))/4)
dset%变异(y=as.numeric(difftime(f,o,units=“weeks”)/4)

您可能还需要使用
dplyr
来执行以下操作:

dset <- data.frame( f = as.Date(c("2016-03-04","2016-12-13","2017-03-01")) , 
                    o = as.Date(c("2016-03-04","2016-12-13","2017-06-02")) )

dset %>% mutate( y = as.numeric(difftime(f,o, units = "weeks"))/4)
dset%变异(y=as.numeric(difftime(f,o,units=“weeks”)/4)

要解决此问题,您可以使用
sapply
mapply
。否则,您可以使用
lubridate
中的函数从日期中提取月份,然后计算差值

library(dplyr)
library(lubridate)
# Sapply
dset %>% 
  mutate(y=sapply(1:length(f), function(i) length(seq(f[i], o[i], by="month")) - 1))

# Mapply
dset %>% 
  mutate(y=mapply(function(x, y) length(seq(x, y, by="month")) - 1, f, o))

# function in lubridate
dset %>% mutate(y=month(o) - month(f))

要解决此问题,您可以使用
sapply
mapply
。否则,您可以使用
lubridate
中的函数从日期中提取月份,然后计算差值

library(dplyr)
library(lubridate)
# Sapply
dset %>% 
  mutate(y=sapply(1:length(f), function(i) length(seq(f[i], o[i], by="month")) - 1))

# Mapply
dset %>% 
  mutate(y=mapply(function(x, y) length(seq(x, y, by="month")) - 1, f, o))

# function in lubridate
dset %>% mutate(y=month(o) - month(f))

您需要进行分组、迭代或调整,使每个
参数的长度为1(
seq(1,5)
可以;
seq(1:2,5:6)
不可以),这意味着
按行
或者
按所有
分组:

库(dplyr)
数据集%
行()
变异(y=长度(顺序(f,o,by='月份'))-1)
#>来源:本地数据帧[3 x 3]
#>小组:
#> 
#>#tibble:3 x 3
#>福伊
#>             
#> 1 2016-03-04 2016-03-04     0
#> 2 2016-12-13 2016-12-13     0
#> 3 2017-03-01 2017-06-02     3

您需要进行分组、迭代或调整,使每个
from
to
参数的长度为1(
seq(1,5)
很好;
seq(1:2,5:6)
不是),这意味着
按行
或者可能
按所有人分组

库(dplyr)
数据集%
行()
变异(y=长度(顺序(f,o,by='月份'))-1)
#>来源:本地数据帧[3 x 3]
#>小组:
#> 
#>#tibble:3 x 3
#>福伊
#>             
#> 1 2016-03-04 2016-03-04     0
#> 2 2016-12-13 2016-12-13     0
#> 3 2017-03-01 2017-06-02     3
“alistaire”犯了一些打字错误,因此答案是错误的

dset %>% 
  rowwise() %>% 
  mutate(y = length(seq(f, o, by = 'month')) - 1)

Source: local data frame [3 x 3]
Groups: <by row>

# A tibble: 3 x 3
           f          o     y
      <date>     <date> <dbl>
1 2016-03-04 2016-03-04     0
2 2016-12-13 2016-12-13     0
3 2017-03-01 2017-06-02     3
dset%>%
行()
变异(y=长度(顺序(f,o,by='月份'))-1)
来源:本地数据帧[3 x 3]
组:
#一个tibble:3x3
福伊
1 2016-03-04 2016-03-04     0
2 2016-12-13 2016-12-13     0
3 2017-03-01 2017-06-02     3
“alistaire”犯了一些打字错误,因此答案是错误的

dset %>% 
  rowwise() %>% 
  mutate(y = length(seq(f, o, by = 'month')) - 1)

Source: local data frame [3 x 3]
Groups: <by row>

# A tibble: 3 x 3
           f          o     y
      <date>     <date> <dbl>
1 2016-03-04 2016-03-04     0
2 2016-12-13 2016-12-13     0
3 2017-03-01 2017-06-02     3
dset%>%
行()
变异(y=长度(顺序(f,o,by='月份'))-1)
来源:本地数据帧[3 x 3]
组:
#一个tibble:3x3
福伊
1 2016-03-04 2016-03-04     0
2 2016-12-13 2016-12-13     0
3 2017-03-01 2017-06-02     3

传递给
seq
函数的是一个数组,它只能接受单个值。传递给
seq
函数的是一个数组,它只能接受单个值。如果使用
lappy
/
对索引进行迭代,这是一个标志,您应该使用
Map
/
mappy
。将其添加到回答中。谢谢如果您正在使用
lappy
/
sapply
迭代索引,那么您应该使用
Map
/
mappy
。将其添加到答案中。谢谢