在dplyr mutate中使用seq函数

时间:2017-06-22 16:14:48

标签: 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(c("2016-03-04","2016-12-13","2017-06-02")) )
dset %>% mutate( y = length(seq(from=f, to=o, by='month')) - 1 )

4 个答案:

答案 0 :(得分:2)

要解决此问题,您可以使用sapplymapply。否则,您可以使用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)

您需要进行分组,迭代或调整,以使每个fromto参数的长度为1(seq(1, 5)很好; seq(1:2, 5:6)不是),这意味着rowwisegroup_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
相关问题