我正在尝试计算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 )
答案 0 :(得分:2)
要解决此问题,您可以使用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 :(得分:0)
您可能还想使用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)
答案 2 :(得分:0)
您需要进行分组,迭代或调整,以使每个from
和to
参数的长度为1(seq(1, 5)
很好; seq(1:2, 5:6)
不是),这意味着rowwise
或group_by_all
:
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 %>%
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> <int>
#> 1 2016-03-04 2016-03-04 0
#> 2 2016-12-13 2016-12-13 0
#> 3 2017-03-01 2017-06-02 3
答案 3 :(得分:0)
&#34; alistaire&#34;做了一些拼写错误,所以答案是错误的
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