При использовании summarise
с plyr
«S ddply
функции, пустые категории удаляются по умолчанию. Вы можете изменить это поведение, добавив .drop = FALSE
. Однако это не работает при использовании summarise
с dplyr
. Есть ли другой способ сохранить в результате пустые категории?
Вот пример с поддельными данными.
library(dplyr)
df = data.frame(a=rep(1:3,4), b=rep(1:2,6))
# Now add an extra level to df$b that has no corresponding value in df$a
df$b = factor(df$b, levels=1:3)
# Summarise with plyr, keeping categories with a count of zero
plyr::ddply(df, "b", summarise, count_a=length(a), .drop=FALSE)
b count_a
1 1 6
2 2 6
3 3 0
# Now try it with dplyr
df %.%
group_by(b) %.%
summarise(count_a=length(a), .drop=FALSE)
b count_a .drop
1 1 6 FALSE
2 2 6 FALSE
Не совсем то, на что я надеялся. Есть ли dplyr
способ добиться того же результата, что и .drop=FALSE
в plyr
?
Ответы:
Поскольку dplyr 0.8
group_by
получил.drop
аргумент, который делает именно то, о чем вы просили:Еще одно примечание к ответу @Moody_Mudskipper: использование
.drop=FALSE
может дать потенциально неожиданные результаты, если одна или несколько группирующих переменных не закодированы как факторы. См. Примеры ниже:источник
count
:iris %>% count(Species, group2, .drop=FALSE)
Проблема все еще не решена, но пока что, тем более что ваши данные уже учтены, вы можете использовать
complete
from "tidyr", чтобы получить то, что вы, возможно, ищете:Если вы хотите, чтобы значение замены было равно нулю, вам нужно указать это с помощью
fill
:источник
ungroup()
до завершения. Если вы когда-нибудь заметите, что наcomplete
самом деле не завершается,ungroup
вероятно, это необходимо.complete(variablewithdroppedlevels, nesting(var1,var2,var3))
(на самом деле это в справке, потому чтоcomplete
мне все еще потребовалось время, чтобы разобратьсяраствор dplyr:
Сначала сделайте сгруппированный df
затем мы суммируем те уровни, которые возникают, подсчитывая с
n()
затем мы объединяем наши результаты во фрейм данных, который содержит все уровни факторов:
наконец, в этом случае, поскольку мы смотрим на счетчики,
NA
значения меняются на 0.Это также можно реализовать функционально, см. Ответы: Добавить строки в сгруппированные данные с помощью dplyr?
Взлом:
Думал , ради интереса выложу ужасный хак, который работает в данном случае. Я серьезно сомневаюсь, что вам когда-либо стоит это делать, но он показывает, как
group_by()
генерируются атрибуты, как если бы этоdf$b
был вектор символов, а не фактор с уровнями. Кроме того, я не претендую на то, чтобы понять это должным образом - но я надеюсь, что это поможет мне научиться - это единственная причина, по которой я публикую это!определить значение «вне пределов», которое не может существовать в наборе данных.
изменить атрибуты на "уловку"
summarise()
:сделать резюме:
проиндексировать и заменить все вхождения oob_val
что дает предполагаемое:
источник
это не совсем то, что было задано в вопросе, но, по крайней мере, для этого простого примера вы можете получить тот же результат, используя xtabs, например:
используя dplyr:
или короче:
результат (равный в обоих случаях):
источник