Dataatable в R - Группировка данных (условно) - PullRequest
0 голосов
/ 17 декабря 2018

предположим, у меня есть следующий фрейм данных.Как я могу создать новый столбец, содержащий среднюю цену для всего идентификатора, взяв за расчет среднее значение диапазона = 2 каждого идентификатора?

dt<-data.frame(id=c(11,11,11,11,12,12,12),range=c(1,1,2,2,1,2,2),price=c(10,20,30,40,10,20,30))

  id range price
1 11     1    10
2 11     1    20
3 11     2    30
4 11     2    40
5 12     1    10
6 12     2    20
7 12     2    30

  id range price price2
1 11     1    10     35
2 11     1    20     35
3 11     2    30     35
4 11     2    40     35
5 12     1    10     25
6 12     2    20     25
7 12     2    30     25

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Решение для data.table выглядит следующим образом:

library(data.table)
dt=as.data.table(dt)[,price2:=mean(price[range==2]),by=id]
0 голосов
/ 18 декабря 2018

Использование объединений для data.table

setDT(dt)
x <- dt[range == 2,list(price2 = mean(price)), by = id]
dt <- dt[x, on = .(id)]
0 голосов
/ 17 декабря 2018

Один из способов сделать это - использовать функцию aggregate.Ниже приведен пример.

dt<-data.frame(id=c(11,11,11,11,12,12,12),range=c(1,1,2,2,1,2,2),price=c(10,20,30,40,10,20,30))
# calculate the menas by id and range
mean_by_group <- aggregate(dt$price, list(id = dt$id, range = dt$range), mean)
# remove other results
mean_by_group <- mean_by_group[mean_by_group$range == 2, ]
# merge back to the original dataframe
dt <- merge(dt, mean_by_group[, c(1, 3)], by = c('id'))

И результаты выглядят так:

  id range price  x
1 11     1    10 35
2 11     1    20 35
3 11     2    30 35
4 11     2    40 35
5 12     1    10 25
6 12     2    20 25
7 12     2    30 25

В качестве альтернативы, вы можете использовать пакеты dplyr и magrittr:

dt %<>% 
  group_by(id, range) %>%
  summarise(price2 = mean(price)) %>%
  filter(range == 2) %>%
  {merge(dt, .[, c(1, 3)], by = 'id')}

Это дает вам:

  id range price price2
1 11     1    10     35
2 11     1    20     35
3 11     2    30     35
4 11     2    40     35
5 12     1    10     25
6 12     2    20     25
7 12     2    30     25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...