seq.int(0,to0-from,by)中的错误:'by'参数中的符号错误

时间:2019-08-08 15:06:57

标签: r date purrr seq

我正在尝试创建一个带有日期序列的长标题数据框。现在,我尝试使用此example。该示例有效,但是当我尝试实现自己的数据时无效。它给出错误消息:Error in seq.int(0, to0 - from, by) : wrong sign in 'by' argument。 At无法弄清楚我的tibble上的代码为什么会抛出错误...非常感谢所有帮助。

此示例有效:

library(tidyverse)

example <- structure(list(idnum = c(17L, 17L, 17L), start = structure(c(8401, 
8401, 8401), class = "Date"), end = structure(c(8765, 8765, 8765
), class = "Date")), class = "data.frame", .Names = c("idnum", 
"start", "end"), row.names = c(NA, -3L)) 

example %>%
  as.tibble() %>%
  nest(start, end) %>% view
  mutate(data = map(data, ~seq(unique(.x$start), unique(.x$end), 1))) %>%
  unnest(data)

这就是我想要的。

我数据上的代码给出了一条错误消息。

df <- structure(list(nieuw = c("Nieuw", "Nieuw", "Nieuw"), jaar = c(NA, 
2013, 2014), aow_jaar = c("65", "65", "65"), aow_maanden = c(NA, 
"1", "2"), vanaf = structure(c(-8036, -8036, -7701), class = "Date"), 
    tot_en_met = structure(c(-8037, -7702, -7367), class = "Date")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -3L))

df %>%
  nest(vanaf, tot_en_met) %>%
  mutate(data = map(data, ~seq(unique(.x$vanaf), unique(.x$tot_en_met), 1))) %>%
  unnest(data)

Error in seq.int(0, to0 - from, by) : wrong sign in 'by' argument

错误消息说它与by =参数有关,但是我不明白为什么它不起作用...

1 个答案:

答案 0 :(得分:1)

在这里,问题在于行(第一行)的结束日期之一低于开始日期。一种选择是检查min/max,然后执行seq

library(dplyr)
library(purrr)
df %>% 
   mutate(out = map2(vanaf, tot_en_met, 
          ~ seq(min(.x, .y), max(.x, .y), by = 1))) # %>%
   # unnest # if needed
# A tibble: 3 x 7
#  nieuw  jaar aow_jaar aow_maanden vanaf      tot_en_met out         
#  <chr> <dbl> <chr>    <chr>       <date>     <date>     <list>      
#1 Nieuw    NA 65       <NA>        1948-01-01 1947-12-31 <date [2]>  
#2 Nieuw  2013 65       1           1948-01-01 1948-11-30 <date [335]>
#3 Nieuw  2014 65       2           1948-12-01 1949-10-31 <date [335]>

此外,我们可以使用min/max以向量化的方式来完成此操作,而不是在每一行中都使用pmin/pmax

df %>%
   mutate(out = map2(pmin(vanaf, tot_en_met), 
                     pmax(vanaf, tot_en_met), seq, by = 1))