#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