Переменные коэффициента конденсации для дублированных идентификаторов в кадре данных - PullRequest
0 голосов
/ 30 мая 2018

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

Вот небольшой пример dat:

library(dplyr)
glimpse(dat)
Observations: 6
Variables: 3
$ ID      <dbl> 1, 1, 1, 2, 2, 2
$ Amount  <dbl> 10, 70, 80, 50, 10, 10
$ Product <fct> A, B, C, B, E, A

ID стоитдля предприятия Amount обозначает сумму денег, которую предприятие потратило, а Product обозначает товар, купленный предприятием.

Проблема в том, что я должен "сжать" эти данные.Итак, каждый идентификатор / сущность может встречаться только один раз.Для непрерывной переменной это не проблема, потому что я могу просто вычислить среднее значение для каждого идентификатора.

library(tidyr)

dat_con_ID <- dat %>% 
    select(ID) %>% 
    unique()

dat_con_Amount <- dat %>% 
    group_by(ID) %>% 
    summarise(Amount = mean(Amount))

dat_con <- inner_join(dat_con_ID, dat_con_Amount, by = "ID")

glimpse(dat_con)
Observations: 2
Variables: 2
$ ID     <dbl> 1, 2
$ Amount <dbl> 53.33333, 23.33333

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

Ответы [ 2 ]

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

Может быть, вы пытаетесь сделать это:

Я использую библиотеку data.table.Я также изменил ваши данные, добавив одну дополнительную строку для ID = 1, чтобы вы могли видеть разницу в выходных данных.

Данные:

library('data.table')
dat <- data.table(ID =as.double(c(1, 1, 1, 2, 2, 2,1)),
                  Amount = as.double(c( 10, 70, 80, 50, 10, 10, 20)),
                  Product = factor( c('A', 'B', 'C', 'B', 'E', 'A', 'A')))

код:

# average amount per id
dat[, .(avg_amt = mean(Amount)), by = .(ID) ]
#    ID  avg_amt
# 1:  1 45.00000
# 2:  2 23.33333

# average product per id
dat[, .SD[, .N, by = Product ][, .( avg_pdt = N/sum(N), Product)], by = .(ID) ]
#    ID   avg_pdt Product
# 1:  1 0.5000000       A
# 2:  1 0.2500000       B
# 3:  1 0.2500000       C
# 4:  2 0.3333333       B
# 5:  2 0.3333333       E
# 6:  2 0.3333333       A

# combining average amount and average product per id
dat[, .SD[, .N, by = Product ][, .( Product,
                                    avg_pdt = N/sum(N), 
                                    avg_amt = mean(Amount))],
    by = .(ID) ]
#    ID Product   avg_pdt  avg_amt
# 1:  1       A 0.5000000 45.00000
# 2:  1       B 0.2500000 45.00000
# 3:  1       C 0.2500000 45.00000
# 4:  2       B 0.3333333 23.33333
# 5:  2       E 0.3333333 23.33333
# 6:  2       A 0.3333333 23.33333    
0 голосов
/ 30 мая 2018

edit

Другая идея состоит в том, чтобы count 'Product' согласно 'ID', рассчитать mean of 'Amount' и относительные частоты для каждого продукта.spread данные по «Продукту» для получения данных в широком формате. Итак, каждый ID / сущность может встречаться только один раз.

dat %>% 
  add_count(Product, ID) %>% 
  group_by(ID) %>% 
  mutate(Amount = mean(Amount),
         n = n / n()) %>%
  unique() %>% 
  spread(Product, n, sep = "_") %>% 
  ungroup()
# A tibble: 2 x 6
#     ID Amount Product_A Product_B Product_C Product_E
#  <dbl>  <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
#1    1.   45.0     0.500     0.250     0.250    NA    
#2    2.   23.3     0.333     0.333    NA         0.333

Моя первая попытка, не то, что ищет OP, но в случае, если кто-то заинтересован:

Как подсказывает @steveb в комментариях, вы можете суммировать Product в виде строки.

library(dplyr)
dat %>% 
 group_by(ID) %>% 
 summarise(Amount = mean(Amount),
           Product = toString( sort(unique(Product)))
           )
 # A tibble: 2 x 3
#     ID Amount Product
#  <dbl>  <dbl> <chr>  
#1    1.   45.0 A, B, C
#2    2.   23.3 A, B, E

data

dat <- structure(list(ID = c(1, 1, 1, 2, 2, 2, 1), Amount = c(10, 70, 
80, 50, 10, 10, 20), Product = structure(c(1L, 2L, 3L, 2L, 4L, 
1L, 1L), .Label = c("A", "B", "C", "E"), class = "factor")), .Names = c("ID", 
"Amount", "Product"), row.names = c(NA, -7L), .internal.selfref = <pointer: 0x2c14528>, class = c("tbl_df", 
"tbl", "data.frame"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...