Для каждого уникального значения в столбце найдите минимум 4 даты - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь найти минимальные 4 даты для каждого уникального значения в столбце и взять среднее из этих 4.

Например,

ID      Date      Value
aa1    1/1/2006    5
aa1    2/1/2007    4
aa1    3/2/2005    7
aa1    1/20/1998   10
aa1    5/3/2001    9
aa1    7/4/2010    10
aa2n   4/3/2002    5
aa2n   4/5/2002    6
aa2n   6/30/2011   7
aa2n   6/21/2012   5
aa2n   1/5/1998    3

Я хотел бы вывести набыть

ID     Avg Value
aa1      7.75
aa2n     5.25

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Вы можете использовать dplyr::top_n с n=-4, чтобы выбрать записи минимум за 4 даты.Использование dplyr::summarise для расчета mean для Value.

library(dplyr)
library(lubridate)

df %>% mutate(Date = mdy(Date)) %>%
  group_by(ID) %>%
  top_n(-4, Date) %>%    #Last 4 records, ordered by Date
  summarise(AvgVal = mean(Value))

# A tibble: 2 x 2
#  ID    AvgVal
#  <chr>  <dbl>
#1 aa1     7.75
#2 aa2n    5.25

Данные:

df <- read.table(text = 
"ID      Date      Value
aa1    1/1/2006    5
aa1    2/1/2007    4
aa1    3/2/2005    7
aa1    1/20/1998   10
aa1    5/3/2001    9
aa1    7/4/2010    10
aa2n   4/3/2002    5
aa2n   4/5/2002    6
aa2n   6/30/2011   7
aa2n   6/21/2012   5
aa2n   1/5/1998    3",
stringsAsFactors = FALSE, header = TRUE)
0 голосов
/ 18 мая 2018

Мы конвертируем 'Date' в Date class, arrange по 'Date' и получаем mean из первых 4 'Value', сгруппированных по 'ID'

library(dplyr)
library(lubridate)
df1 %>% 
  group_by(ID) %>% 
  arrange(mdy(Date)) %>%
  summarise(Value = mean(head(Value, 4)))
# A tibble: 2 x 2
#  ID    Value
#   <chr> <dbl>
#1 aa1    7.75
#2 aa2n   5.25

Или мы можем сделать это с data.table

library(data.table)
setDT(df1)[order(mdy(Date)),.(Value = mean(head(Value, 4))), ID]
#     ID Value
#1: aa2n  5.25
#2:  aa1  7.75
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...