Xtabs计数为Na和Na.Action = Na

  • 本文关键字:Na Action Xtabs r na
  • 更新时间 :
  • 英文 :


我有以下data.frame

x <- data.frame(A = c("Y", "Y", "Z", NA),
                B = c(NA, TRUE, FALSE, TRUE),
                C = c(TRUE, TRUE, NA, FALSE))

我需要计算下表:

A     B  C
Y     1  2
Z     0  0
<NA>  1  0

但是,即使使用na.action = na.pass

,我也无法通过xtabs实现此结果
xtabs(formula = cbind(B, C) ~ A,
      data = x,
      addNA = TRUE,
      na.action = na.pass)
A       B  C
  Y        2
  Z     0   
  <NA>  1  0

来自 ?xtabs

na.Action
一个指示数据时应发生什么的函数 包含NAS。如果未指定,并且addna为真,则将其设置为 na.Pass。当它是na.pass且公式有左侧(带有 计数(,sum(*,na.rm = true(代替sum(*( 计数。

addna
逻辑指示NAS是否应该获得单独的水平 并使用addna(*,ifany = true(进行计数,并为 na.Action。

作为解决方法,我可以由FALSE替换NA

x[is.na(x$B), "B"] <- FALSE
x[is.na(x$C), "C"] <- FALSE
xtabs(formula = cbind(B, C) ~ A,
      data = x,
      addNA = TRUE)
A      B C
  Y    1 2
  Z    0 0
  <NA> 1 0

或我可以使用聚合:

aggregate(formula = cbind(B, C) ~ addNA(A),
          data = x,
          FUN = sum,
          na.rm = TRUE,
          na.action = na.pass)
  addNA(A) B C
1            Y 1 2
2            Z 0 0
3         <NA> 1 0

但是如何使用xtabs获得该表,而无需FALSE替换NA

na.action=na.pass更改为na.action=NULL

xtabs(formula = cbind(B, C) ~ A,
      data = x,
      addNA = TRUE,
      na.action = NULL)
A      B C
  Y    1 2
  Z    0 0
  <NA> 1 0