我有一个这样的数据框架:
data.frame(name = c("a", "b", "c", "d"),
date = c("2018-09", "2018-10", "2018-9", "2018-11"))我想要将任何与另一个名称共享日期的名称组合成一行,用逗号分隔,第二列显示它们共享的日期
data.frame(name = c("a,c", "b", "d"),
date = c("2018-09", "2018-10", "2018-11"))发布于 2018-09-26 05:59:12
我假设你的样本数据中不同的日期格式是真实的,也就是说,你的数据中"2018-09" "2018-9" 和对应于同一个month+year。
在这种情况下,您可以执行以下操作
df %>%
mutate(date = as.Date(paste0(date, "-01"), "%Y-%m-%d")) %>%
group_by(date) %>%
summarise(name = toString(name)) %>%
mutate(date = format(date, format = "%Y-%m"))
# # A tibble: 3 x 2
# date name
# <chr> <chr>
#1 2018-09 a, c
#2 2018-10 b
#3 2018-11 d样本数据
df <- data.frame(name = c("a", "b", "c", "d"),
date = c("2018-09", "2018-10", "2018-9", "2018-11"))发布于 2018-09-26 05:55:56
您可以在dplyr中使用group_by和summarize完成此操作。
由于您正在处理日期,因此重要的是将它们转换为标准格式(在您的示例中没有),这样相同的日期就被认为是相同的。
在我看来,lubridate包是实现这一点的最简单方法。在下面的示例中,我们将date变量解析为一个4位数的年份Y和十进制月份m,然后按照与前面相同的日期进行分组:
df2 <- data.frame(name = c("a", "b", "c", "d"),
date = c("2018-09", "2018-10", "2018-9", "2018-11"))
df2 %>%
mutate(date = lubridate::parse_date_time(date, 'Ym')) %>%
group_by(date) %>%
summarise(name = paste0(name, collapse = ','))
# A tibble: 3 x 2
date name
<dttm> <chr>
1 2018-09-01 00:00:00 a,c
2 2018-10-01 00:00:00 b
3 2018-11-01 00:00:00 d 发布于 2018-09-26 05:59:00
使用@divibisan答案中的R基础aggregate和df:
> aggregate(name~date, data=df, paste, collapse = ",")
date name
1 2018-09 a,c
2 2018-10 b
3 2018-11 dhttps://stackoverflow.com/questions/52507166
复制相似问题