R-将具有重复日期的名称合并为单行

时间:2018-09-25 21:52:16

标签: r

我有一个像这样的数据框:

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"))

3 个答案:

答案 0 :(得分:1)

我认为与您的样本数据不同的日期格式是真实的,即您拥有"2018-09""2018-9"对应于同一月+年的数据。

在这种情况下,您可以执行以下操作

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"))

答案 1 :(得分:0)

您可以在dplyr中使用group_bysummarize进行此操作。

由于您正在使用日期,因此必须将它们设置为标准化格式(在示例中不是这样),以便将相同的日期视为相同。

在我看来,lubridate软件包是最简单的方法。在下面的示例中,我们将日期变量解析为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    

答案 2 :(得分:0)

使用@divibisan答案中的R基数aggregatedf

> aggregate(name~date, data=df,  paste, collapse = ",")
     date name
1 2018-09  a,c
2 2018-10    b
3 2018-11    d