Как агрегировать в R с условиями - PullRequest
1 голос
/ 04 мая 2020
x <- data.frame(names=c("peter","peter", "jacob", "jacob"),
            some_score =c(5,8,6,8),
            xDate = as.Date(c("2018-01-01", "2019-01-01" , "2018-06-08", 
"2019-10-22"))

)

В этом кадре данных необходимо агрегировать, поэтому я получаю последнюю оценку для каждого имени (Петр = 8 и Джейкоб = 8)

Есть ли быстрый способ сделай это? Прямо сейчас я создаю два совокупных кадра данных и связываю их. Но это кажется неэффективным

Ответы [ 5 ]

3 голосов
/ 04 мая 2020

Мы можем получить строку с max xDate для каждого names.

Это можно сделать с помощью dplyr

library(dplyr)
x %>% group_by(names) %>% slice(which.max(xDate))

#  names  some_score  Date     
#   <chr>      <dbl> <date>    
#1 jacob          8 2019-10-22
#2 peter          8 2019-01-01

или data.table

library(data.table)
setDT(x)[, .SD[which.max(xDate)], names]
2 голосов
/ 04 мая 2020
> aggregate(x,list(x$names),tail,1)
  Group.1 names some_score      xDate
1   jacob jacob          8 2019-10-22
2   peter peter          8 2019-01-01

при условии, что ваш фрейм данных отсортирован, иначе сначала отсортируйте его по времени.

1 голос
/ 04 мая 2020

Base R один вкладыш:

data.frame(do.call("rbind", lapply(split(x, x$names), function(x){x[which.max(x$xDate),]})), 
           row.names = NULL)
1 голос
/ 04 мая 2020

Другое решение:

library(magrittr)

x %>% 
  dplyr::group_by(names) %>% 
  dplyr::filter(xDate == max(xDate))
0 голосов
/ 04 мая 2020

пакет dplyr - отличный вариант для вашего вопроса.

x <- data.frame(names=c("peter","peter", "jacob", "jacob"),
                some_score =c(5,8,6,8),
                xDate = as.Date(c("2018-01-01", "2019-01-01" , "2018-06-08", 
                                  "2019-10-22")))
library(dplyr)
x %>% 
  group_by(names) %>% 
  summarise(max_some_score = max(some_score))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...