процентная таблица с отсутствующими категориями

Я пытаюсь рассчитать процент 0,1,2,3 каждого столбца в r, используя комбинацию prop.table и do.call.

tblpercent <- function(x){
  round(prop.table(table(x)),4)
}

do.call(cbind,lapply(A,tblpercent))

Однако некоторые столбцы не содержат полного набора 0-3, например, данные выглядят как A:

A <- data.frame(matrix( 
  c(0,1,2,1,2,3,2,2,2,3,3,3,1,1,0,3,3,3), 
  nrow=6, ncol=3,  byrow = TRUE))

И он вернет ошибку следующим образом:

      X1     X2     X3
0 0.1667 0.3333 0.1667
1 0.3333 0.3333 0.3333
2 0.1667 0.3333 0.5000
3 0.3333 0.3333 0.1667

Я понимаю, что ошибка связана с отсутствием 0 в X2, 1 в X3, поэтому возвращаемый процент содержит только 3 поля. Можно ли это легко исправить, или мне следует переписать всю функцию?

Правильный вывод должен быть таким:

      X1     X2     X3
0 0.1667 0.0000 0.1667
1 0.3333 0.3333 0.0000
2 0.1667 0.3333 0.3333
3 0.3333 0.3333 0.5000

person ceoec    schedule 11.07.2016    source источник


Ответы (1)


Мы можем исправить это, сделав его factor с levels указанным в функции tblpercent

 tblpercent <- function(x, Un){
     round(prop.table(table(factor(x, levels = Un))),4)
 }

 Un1 <- sort(unique(unlist(A)))
 do.call(cbind, lapply(A, tblpercent, Un= Un1))
 #   X1     X2     X3
 #0 0.1667 0.0000 0.1667
 #1 0.3333 0.3333 0.0000
 #2 0.1667 0.3333 0.3333
 #3 0.3333 0.3333 0.5000

Используя функцию OP, выходные данные, сгенерированные с помощью lapply, могут иметь некоторые отсутствующие уровни, что приводит к разнице в length между каждым из элементов list. Так что cbind работать не будет.

person akrun    schedule 11.07.2016