Сводные данные с одинаковым идентификатором и датой - PullRequest
1 голос
/ 08 февраля 2020

У меня есть этот фрейм данных

df <- data.frame(id = c(1,1,2), 
                 date = c("2008-08-04 05:45:07","2008-08-04 09:45:07","2008-08-04 05:45:07"), 
                 text = c("stg","another","final"))

И я хотел бы сделать агрегацию, чтобы получить этот вывод

data.frame(id = c(1,2), 
           date = c("2008-08-04", "2008-08-04"), 
           text = c("stg another","final"))

Я использую это, но он возвращает входной идентификатор

aggregate(text ~ date + id, df, paste, sep = " ")

Как это исправить?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

Вот предложение с использованием dplyr:

library(dplyr)

df %>% 
  arrange(date) %>%
  mutate(date_day = format(as.Date(date, "%Y-%m-%d %H:%M:%S"), "%Y-%m-%d")) %>% 
  group_by(id, date_day) %>% 
  summarise(text = paste(text, collapse=" "))

, которое возвращает:

# A tibble: 2 x 3
# Groups:   id [2]
     id date_day   text       
  <dbl> <chr>      <chr>      
1     1 2008-08-04 stg another
2     2 2008-08-04 final 

Объяснение:

  1. Сортировать по дате -time date, поэтому конкатенация строк на шаге summarise в конце получает строки в правильном порядке

  2. Извлечение date_day части из даты-времени

  3. Группировка по date_day и id

  4. Для каждой комбинации date_day - id комбинаций всех элементов text, используя "" (пробел) в качестве разделителя.

Редактировать:

Решение с использованием base R:

aggregate(text ~ format(as.Date(date, "%Y-%m-%d %H:%M:%S"), "%Y-%m-%d") + id, df, paste, sep = " ")
0 голосов
/ 08 февраля 2020

В контексте вашего исходного вопроса я бы сделал:

library(tidyverse)

df <- data.frame(id = c(1,1,2), 
                 date = c("2008-08-04 05:45:07","2008-08-04 09:45:07","2008-08-04 05:45:07"), 
                 text = c("stg","another","final")) %>%
  mutate(date = str_sub(date, 1, 10))


aggregate(text ~ date + id, df, paste, collapse = " ") 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...