使用dplyr展开含日期列表的列时调用unnest()遇报错求助
解决tidyr::unnest()处理日期序列列表时的报错问题
嗨,咱们来一步步拆解你遇到的问题:你想给每行生成从x到y的10分钟间隔日期序列,再用unnest()展开,但触发了报错对吧?这大概率是tidyr版本更新后的语法变化,或者rowwise()带来的隐性结构问题,下面给你两种靠谱的解决办法:
问题根源
在较新的tidyr版本中,unnest()对输入列的结构要求更严格,直接传入列名时,rowwise()环境下生成的列表列可能被识别异常;另外如果存在x >= y的行(你的案例里没有,但得提前预防),seq.POSIXt会返回空向量,也会导致unnest()失败。
修复方案1:适配新版tidyr的unnest()语法
直接在unnest()里用cols参数指定要展开的列,就能解决识别问题:
library(tidyverse) # 先创建数据 x <- seq(from= as.POSIXct('2011-01-01 14:00:00'),length.out=100,by = "hour") y <- seq(from= as.POSIXct('2012-01-01 14:00:00'),length.out=100,by = "hour") df <- data.frame(x,y) # 修改后的代码 df %>% rowwise() %>% mutate(sequence = list(seq.POSIXt(x, y, "10 min"))) %>% unnest(cols = c(sequence)) # 这里明确指定cols参数
修复方案2:用map2替代rowwise()(更高效)
其实没必要用rowwise(),用purrr的map2可以更高效地逐行生成序列列表,还能避免rowwise()带来的潜在问题:
df %>% mutate(sequence = map2(x, y, ~seq.POSIXt(.x, .y, "10 min"))) %>% unnest(cols = c(sequence))
额外小贴士
如果你的数据里可能存在x > y的行(此时seq.POSIXt会返回空向量),想要保留这些行的话,可以给unnest()加上keep_empty = TRUE参数:
df %>% mutate(sequence = map2(x, y, ~seq.POSIXt(.x, .y, "10 min"))) %>% unnest(cols = c(sequence), keep_empty = TRUE)
这样就能顺利完成日期序列的展开啦~
内容的提问来源于stack exchange,提问作者ArunK
相关产品推荐
相关产品推荐

