【问题标题】:Error in mutate_impl(.data, dots) : Column `..........` must be length ... (the group size) or one, notmutate_impl(.data, dots) 中的错误:列 `..........` 必须是长度 ...(组大小)或一,不是
【发布时间】:2019-03-01 14:31:04
【问题描述】:

我有以下数据框:

mydf <- data.frame(Date.Start = as.Date(c("2015-09-01", "2015-09-10")),
                   Date.End = as.Date(c("2017-09-10", "2020-09-15")),
                   Number.of.Years = c(3, 6),
                   stringsAsFactors = FALSE)

#  Date.Start   Date.End Number.of.Years
#1 2015-09-01 2017-09-10               3
#2 2015-09-10 2020-09-15               6

我正在尝试“炸毁”每年一行的数据框:

#  Date.Start   Date.End Number.of.Years  Year
#1 2015-09-01 2017-09-10               3  2015
#1 2015-09-01 2017-09-10               3  2016
#1 2015-09-01 2017-09-10               3  2017
#2 2017-09-10 2020-09-15               6  2015
#2 2017-09-10 2020-09-15               6  2016
#2 2017-09-10 2020-09-15               6  2017
#2 2017-09-10 2020-09-15               6  2018
#2 2017-09-10 2020-09-15               6  2019
#2 2017-09-10 2020-09-15               6  2020

所以我尝试了以下方法:

library(splitstackshape)
library(dplyr)
library(lubridate)

expandRows(mydf, "Number.of.Years", drop = FALSE) %>%
  group_by(Date.Start, Date.End) %>%
  mutate(Date = seq(year(first(Date.Start)),
                    year(first(Date.End)),
                    by = 1))

但我收到以下错误:

Error in mutate_impl(.data, dots) : 
  Column `Date` must be length 6 (the group size) or one, not 4

上面的代码出了什么问题?

如果我尝试将其更改为天数(来自 stackoverflow 上的另一篇文章),它可以正常工作:

mydf <- data.frame(Date.Start = as.Date(c("2015-09-01", "2015-09-10")),
                   Date.End = as.Date(c("2015-09-03", "2015-09-15")),
                   Number.of.Days = c(3, 6),
                   stringsAsFactors = FALSE)

library(splitstackshape)
library(dplyr)
library(lubridate)

expandRows(mydf, "Number.of.Days", drop = FALSE) %>%
  group_by(Date.Start, Date.End) %>%
  mutate(Date = seq(first(Date.Start),
                    first(Date.End),
                    by = 1))

# A tibble: 9 x 4
# Groups:   Date.Start, Date.End [2]
#  Date.Start Date.End   Number.of.Days Date      
#  <date>     <date>              <dbl> <date>    
#1 2015-09-01 2015-09-03              3 2015-09-01
#2 2015-09-01 2015-09-03              3 2015-09-02
#3 2015-09-01 2015-09-03              3 2015-09-03
#4 2015-09-10 2015-09-15              6 2015-09-10
#5 2015-09-10 2015-09-15              6 2015-09-11
#6 2015-09-10 2015-09-15              6 2015-09-12
#7 2015-09-10 2015-09-15              6 2015-09-13
#8 2015-09-10 2015-09-15              6 2015-09-14
#9 2015-09-10 2015-09-15              6 2015-09-15

【问题讨论】:

  • 工作代码和你的代码有什么区别?
  • @josemz 感谢您的关注。现在改了。
  • 问题是 2020 到 2017 年没有 6 年,只有 4 年,这就是错误信息所说的。请注意,在您的示例中,1 到 3 之间有 3 天,10 到 15 之间有 6 天。

标签: r group-by dplyr


【解决方案1】:

如果您必须有不同的年份,这就是为什么它在您的第一种情况下不起作用(2015 年与 2020 年 - 您有 6 行要填充,并且您试图将 seq 放在 2015 年至 2020 年之间,因此出现错误),那么我们可以使用组大小n() 来创建序列,即

library(tidyverse)
library(splitstackshape)

expandRows(mydf, "Number.of.Years", drop = FALSE) %>% 
   group_by(grp = cumsum(!duplicated(paste0(Date.Start, Date.End)))) %>% 
   mutate(Date = seq(first(Date.Start), (first(Date.Start)+n()-1), by = 1))

给出,

# A tibble: 9 x 5
# Groups:   grp [2]
  Date.Start Date.End   Number.of.Years   grp Date      
  <date>     <date>               <dbl> <int> <date>    
1 2015-09-01 2015-09-03               3     1 2015-09-01
2 2015-09-01 2015-09-03               3     1 2015-09-02
3 2015-09-01 2015-09-03               3     1 2015-09-03
4 2017-09-10 2020-09-15               6     2 2017-09-10
5 2017-09-10 2020-09-15               6     2 2017-09-11
6 2017-09-10 2020-09-15               6     2 2017-09-12
7 2017-09-10 2020-09-15               6     2 2017-09-13
8 2017-09-10 2020-09-15               6     2 2017-09-14
9 2017-09-10 2020-09-15               6     2 2017-09-15

【讨论】:

  • 对不起,我不是这个意思。我现在更新/改进了我的帖子。
【解决方案2】:

我自己解决了这个问题。这似乎是我不知道的数据质量问题。

因此,如果您执行 group_by,您必须确定没有具有相同特征但具有不同 date.start 和/或 date.end 的重复行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2018-06-02
    • 1970-01-01
    • 2015-12-22
    • 2018-12-27
    • 2018-06-29
    相关资源
    最近更新 更多