агрегат в r удаляет 0 в таблице.Как заставить это показать? - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь сгенерировать таблицу с aggregate для дальнейшей обработки, используя аргумент FUN в aggregate.Вот мой код

var <- c(1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0)

aggregate(var, list(group), FUN = table)

, но результат отображается следующим образом: группа 4 не имеет значения для второго уровня (0 или 1)

  Group.1      x
1       1  61, 3
2       2 112, 3
3       3  30, 2
4       4     21

Требуемый результат должен бытькак это:

  Group.1  x.0  x.1
1       1  61   3
2       2 112   3
3       3  30   2
4       4  21   0

Как это исправить?

1 Ответ

0 голосов
/ 24 сентября 2018

Нам нужно создать 'var' как factor с levels, указанным как 0 и 1. Это позволит убедиться, что если счетчик равен 0 для определенного столбца, который будет отображаться как 0

var <- factor(var, levels = 0:1)
out <- aggregate(var, list(group), FUN = table)
out
#   Group.1 x.0 x.1
#1       1  29  21
#2       2  29  21
#3       3  23  27
#4       4   0  50

Или используйте метод formula

out <- aggregate(var ~ group, FUN = table)

Обратите внимание, что это приведет к matrix 'x' с двумя столбцами.Для того чтобы обычные data.frame столбцы

do.call(data.frame, out)

Или, в случае изменения, мы также можем получить sum из 1 с, а затем reshape

reshape(aggregate(cbind(n = rep(1, length(group))) ~ 
  group+ var, FUN = sum), idvar = 'group', direction = 'wide', timevar = 'var')

Если мы используем tidyverse, вместо того, чтобы делать какие-либо изменения в class, то есть преобразовывать в factor, выполните count, используя обе переменные, а затем spread переведите его в 'wide'формат

library(tidyverse)
tibble(var, group) %>% 
    count(var, group) %>%
    spread(var, n, fill = 0)
# A tibble: 4 x 3
#  group   `0`   `1`
#  <int> <dbl> <dbl>
#1     1    29    21
#2     2    29    21
#3     3    23    27
#4     4     0    50

данные

set.seed(24)
var <- sample(0:1, 200, replace = TRUE)
var[151:200] <- 1
group <- rep(1:4, each = 50)
...