r Группировать по и подсчитывать

#r #group-by #dplyr #plyr #reshape2

#r #группировать по #dplyr #плир #изменение формы 2

Вопрос:

Я имею дело с набором данных, который выглядит следующим образом

       Id     Date           Color
      10     2008-11-17     Red
      10     2008-11-17     Red
      10     2008-11-17     Blue
      10     2010-01-26     Red
      10     2010-01-26     Green
      10     2010-01-26     Green
      10     2010-01-26     Red
      29     2007-07-31     Red
      29     2007-07-31     Red
      29     2007-07-31     Blue
      29     2007-07-31     Green
      29     2007-07-31     Red
  

Моя цель — создать набор данных, подобный этому

      Color      Representation      Count            Min   Max
     Red        1   1   1  = 3      2   2   3 = 7    2     3
     Blue       1   1      = 2      1   1            1     1
     Green      1    1     = 2      2   1            1     2
  

Представление

Значение в 1 строке, 2 столбце (Представление) равно 3, потому что красный представлен три раза на основе уникальной комбинации идентификатора и даты. Например, 1 и 2 строки совпадают, идентификатор (10) и дата (2008-11-17), поэтому эта комбинация представлена один раз (1(10, 2008-11-17)). 4-я и 7-я строки имеют одинаковую комбинацию идентификатора (10) и даты (2010-01-26), поэтому эта уникальная комбинация представлена один раз (1(10, 2010-01-26)) . 8, 9, 12 — это одинаковые комбинации идентификатора (29) и даты (2007-07-31), и аналогично это представлено один раз (1(29, 2007-07-31)). Таким образом, значение равно 3 в строке 1, столбец 2.

1(10, 2008-11-17) 1(10, 2010-10-26) 1(29, 2007-07-31) =3

Подсчитывать

Значение в 1 строке, 3 столбце (количество) равно 7, потому что красный цвет упоминается дважды по идентификатору 10 на 2008-11-17 (2 10, 2008-11-17), снова красный цвет упоминается дважды по идентификатору 10 на 2010-01-26 (2 10, 2010-01-26) и три раза по идентификатору 29 на 2007-07-31 2 29,2007-07-31

2(10, 2008-11-17) 2(10, 2010-10-26) 3(29, 2007-07-31)

Любая помощь по выполнению этой уникальной таблицы частот / подсчетов очень ценится.

Набор данных

 Id   = c(10,10,10,10,10,10,10,29,29,29,29,29) 
Date = c("2008-11-17", "2008-11-17", "2008-11-17","2010-01-26","2010-01-26","2010-01-26","2010-01-26",
         "2007-07-31","2007-07-31","2007-07-31","2007-07-31","2007-07-31") 
Color = c("Red", "Red", "Blue", "Red", "Green", "Green", "Red", "Red", "Red", "Blue", "Green", "Red") 
df = data.frame(Id, Date, Color)  
  

Комментарии:

1. две таблицы? cbind(data.frame(table(df$Color)), Rep = colSums(!!table(interaction(df$Id, df$Date), df$Color)))

Ответ №1:

С dplyr :

 library(dplyr)
dat %>% group_by(Color) %>%
    summarize(Representation = n_distinct(Id, Date), Count = n())
# # A tibble: 3 × 3
#    Color Representation Count
#   <fctr>          <int> <int>
# 1   Blue              2     2
# 2  Green              2     3
# 3    Red              3     7
  

Комментарии:

1. это было идеально, как мне получить диапазон (max-min) для значений в столбце Count, а также IQR (межквартильный диапазон)?

2. С помощью range() и IQR() функций, соответственно.

3. 🙂 эти два не сработали, поэтому я попробовал это, min(n()) и max(n()) я не получаю правильные значения,

Ответ №2:

Другой вариант data.table

 library(data.table)
setDT(df)[, .(Representation = uniqueN(paste(Id, Date)), Count = .N) , by = Color]
#     Color Representation Count
#1:   Red              3     7
#2:  Blue              2     2
#3: Green              2     3
  

Обновить

Для второго вопроса мы можем попробовать

 library(matrixStats)
m1 <- sapply(split(df[["Color"]], list(df$Id, df$Date), drop = TRUE),  function(x) table(x))
v1 <- (NA^!m1) * m1
df1 <- data.frame(Color = row.names(m1), Representation = rowSums(m1!=0), 
   Count = rowSums(m1), Min = rowMins(v1, na.rm=TRUE),
    Max = rowMaxs(v1, na.rm=TRUE))
row.names(df1) <- NULL
df1
#   Color Representation Count Min Max
#1  Blue              2     2   1   1
#2 Green              2     3   1   2
#3   Red              3     7   2   3
  

Комментарии:

1. @HeatherKeturah Ты имел в виду setDT(df)[, .(Representation = uniqueN(paste(Id, Date)), Count = .N) , by = Color][, c("Min", "Max", "Iqr") := .(min(Count), max(Count), IQR(Count))][]

2. @HeatherKeturah Или если вы хотите использовать range функцию, то setDT(df)[, .(Representation = uniqueN(paste(Id, Date)), Count = .N) , by = Color][, c("Min", "Max", "Iqr") := c(as.list(range(Count)), IQR(Count))][]

3. @HeatherKeturah Я не уверен, как вы получили эти значения. Основываясь на выводе, показанном здесь, нет такой информации о 1, 1 или 1, 2 для красного и зеленого

4. @HeatherKeturah Если вам нужны IQR, то rowIQRs(m1) будет другой столбец

5. это было идеально. Я никогда не был новичком в пакете matrixStats, я просматриваю документацию для этого пакета и нахожу много интересного. Большое спасибо, я хотел бы дать 100 баллов 🙂

Ответ №3:

Вы можете использовать aggregate() функцию:

 # Make a new column for the Date-Id joined (what you want to base the counts on
df$DateId <- paste(df$Date, df$Id)

# Get the representation values
Representation <- aggregate(DateId ~ Color, data=df,FUN=function(x){length(unique(x))})
Representation
#>   Color DateId
#> 1  Blue      2
#> 2 Green      2
#> 3   Red      3

# Get the Count values
Count <- aggregate(DateId ~ Color, data=df,FUN=length)
Count
#>   Color DateId
#> 1  Blue      2
#> 2 Green      3
#> 3   Red      7