使用 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 时使用排列时出错的主要内容,如果未能解决你的问题,请参考以下文章