1

我正在尝试使用prop.table&的组合计算 r 中每列的 0、1、2、3 的百分比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

我知道错误是由于 X2 中缺少 0,X3 中缺少 1,因此返回的百分比仅包含 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
4

1 回答 1

1

我们可以通过在函数factorlevels指定它来解决这个问题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将无法正常工作。

于 2016-07-11T09:06:53.710 回答