Превратите строки в столбцы и получите последнюю запись - используя R - PullRequest
0 голосов
/ 03 сентября 2018

У меня проблема с попыткой преобразовать строки в столбцы, а затем получить только последнюю запись (с использованием метки времени). Вот мой набор данных:

enter image description here

Ниже приведен код для генерации этого набора данных:

df <- data.frame(id = c("123||wa", "123||wa", "123||wa", "223||sa", "223||sa", "223||sa", "123||wa"),
               questions = c("dish", "car", "house", "dish", "house", "car", "dish"),
               answers = c("pasta", "bmw", "yes", "pizza", "yes", "audi","ravioli" ), 
               timestamp = c("03JUL2014:15:38:11", "07JAN2015:15:22:54", "24MAR2018:12:24:16", "24MAR2018:12:24:16",
               "04AUG2014:12:40:30", "03JUL2014:15:38:11", "05FEB2018:17:23:16"))

Желаемый результат:

enter image description here

код, сгенерировавший вывод:

output <- data.frame(id = c("123||wa", "223||sa"), dish = c("ravioli", "pizza"), 
                 car = c("bmw", "audi"), house = c("yes", "yes"))

ПРИМЕЧАНИЕ. Как видно из исходного набора данных, для поля id было несколько строк. Что еще более важно, было две строки для идентификатора '123 || wa' относительно их любимого блюда, но в окончательном выводе требуется только их последний ответ.

Любая помощь будет принята с благодарностью. Спасибо

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Скорее всего, столбец date_time должен быть сначала преобразован в правильный тип (здесь используются ymd_hms из lubridate и strptime), поскольку извлеченное значение должно соответствовать самой последней записи по date_time. После этого несколько функций из dplyr пригодятся

library(lubridate)
library(dplyr)
df %>%
  mutate(timestamp = ymd_hms(strptime(timestamp, "%d%b%Y:%H:%M:%S"))) %>%
  group_by(id, questions) %>%
  arrange(timestamp) %>%
  summarise(last = last(answers)) %>%
  spread(questions, last)

#output
# A tibble: 2 x 4
# Groups: id [2]
  id      car   dish    house
* <fct>   <fct> <fct>   <fct>
1 123||wa bmw   ravioli yes  
2 223||sa audi  pizza   yes  

Деталь ymd_hms(strptime(... можно заменить на:

mutate(timestamp = parse_date_time(timestamp,  orders = "%d%b%Y:%H:%M:%S"))

см.

?strptime

о том, как построить формат date_time

0 голосов
/ 03 сентября 2018

Вы можете сделать с библиотеками tidyr и dplyr: сначала суммируйте, взяв последний ответ, а затем преобразуйте data.frame:

output <-   df%>%
arrange(id, timestamp) %>%
group_by(id, questions)%>%
summarise(last=last(answers))%>%
spread(questions, last)
...