使用 group_by 时出错,而不是在减去两个日期列 R 时使用排列时出错

Posted

技术标签:

【中文标题】使用 group_by 时出错,而不是在减去两个日期列 R 时使用排列时出错【英文标题】:Error while using group_by and not while using arrange when subtracting two date columns R 【发布时间】:2021-07-14 19:43:42 【问题描述】:

在下面的数据框中,我试图根据 Col1 从 Col3 中识别对应于每个组的最高日期,并从每个组的最高日期中减去 Col2 日期,以获得 Col4 中的年份时差:

Data_Frame <- data.frame(Col1 = c("A1", "A1", "A1", "A2", "A2", "A2", "A3", "A3", "A3"), 
                         
                         Col2 = c("2011-03-11", "2014-08-21", "2016-01-17", "2017-06-30", "2018-07-11", "2018-11-28", "2019-09-04", "2020-02-29", "2020-07-12"),
                         
                         Col3 = c("2018-10-22", "2019-05-24", "2020-12-25", "2018-10-12", "2019-09-24", "2020-12-19", "2018-10-22", "2019-06-14", "2020-12-20"))

预期结果是:

这些选项都不会产生结果:

选项 1

Data_Frame <- Data_Frame %>% group_by(Col1) %>% mutate(Col4 = as.numeric(as.POSIXct(max(Data_Frame$Col3)) -  as.POSIXct(Data_Frame$Col2)) / 365.75)

选项 2

Data_Frame <- Data_Frame %>% group_by(Col1) %>% mutate(Col4 = as.numeric(difftime(max(Data_Frame$Col3), Data_Frame$Col2, unit="weeks"))/ 52.25)

我不断收到以下错误:

> Data_Frame <- Data_Frame %>% group_by(Col1) %>% mutate(Col4 = as.numeric(as.POSIXct(max(Data_Frame$Col3)) -  as.POSIXct(Data_Frame$Col2)) / 365.75)
Error: Problem with `mutate()` input `Col4`.
x Input `Col4` can't be recycled to size 3.
i Input `Col4` is `as.numeric(as.POSIXct(max(Data_Frame$Col3)) - as.POSIXct(Data_Frame$Col2))/365.75`.
i Input `Col4` must be size 3 or 1, not 9.
i The error occured in group 1: Col1 = "A1".
Run `rlang::last_error()` to see where the error occurred.
> rlang::last_error()
<error/dplyr_error>
Problem with `mutate()` input `Col4`.
x Input `Col4` can't be recycled to size 3.
i Input `Col4` is `as.numeric(as.POSIXct(max(Data_Frame$Col3)) - as.POSIXct(Data_Frame$Col2))/365.75`.
i Input `Col4` must be size 3 or 1, not 9.
i The error occured in group 1: Col1 = "A1".
Backtrace:
  1. dplyr::group_by(., Col1)
  9. dplyr::mutate(...)
 11. dplyr:::mutate_cols(.data, ...)
 12. base::tryCatch(...)
 13. base:::tryCatchList(expr, classes, parentenv, handlers)
 14. base:::tryCatchOne(expr, names, parentenv, handlers[[1L]])
 15. value[[3L]](cond)
 16. dplyr:::stop_mutate_recycle_incompatible_size(e, index = i, dots = dots)
 17. dplyr:::stop_dplyr(...)
Run `rlang::last_trace()` to see the full context.

但是,如下所示,使用安排而不是 group_by 可以:

Data_Frame <- Data_Frame %>% arrange(Col1) %>% mutate(Col4 = as.numeric(as.POSIXct(max(Data_Frame$Col3)) -  as.POSIXct(Data_Frame$Col2)) / 365.75)

Data_Frame <- Data_Frame %>% arrange(Col1) %>% mutate(Col4 = as.numeric(difftime(max(Data_Frame$Col3), Data_Frame$Col2, unit="weeks"))/ 52.25)

我通过 group_by 语句做错了什么,为什么它不起作用?

数据框的结构是:

【问题讨论】:

您使用Data_Frame$Col2 而不仅仅是Col2 有什么原因吗? 我以为我是通过执行 which 来专门选择列。 在 dplyr 函数中,您可以只使用裸列名称。 删除哪些有效。谢谢。 酷,我已经把它记下来作为答案,所以如果它解决了你的问题,你可以标记为已解决。 【参考方案1】:

在 dplyr 函数中,您可以只写 Col2(裸列名称)而不是 Data_Frame$Col2

【讨论】:

以上是关于使用 group_by 时出错,而不是在减去两个日期列 R 时使用排列时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何从不同的表中减去两个整数值

使用 group_by 将两个不同表列的总和获取到单个列

将字符串反序列化为 *.proto 中定义的对象时出错?

group_by 跨多个列的唯一计数

如何使用javascript减去数组中的值

sql server 2005 死锁在生产中超时,而不是在测试环境中:为啥?