xtabs的计数为NA,R中的na.action = na.pass

时间:2019-05-21 12:07:21

标签: 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

但是,即使使用xtabs,我也无法使用na.action = na.pass来达到这个结果:

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
  指示当数据出现时应该发生什么的功能   包含NA。如果未指定,并且addNA为true,则将其设置为   na.pass。如果为na.pass并且公式的左侧为   计数),使用sum(*,na.rm = TRUE)代替sum(*)   计数。

     

addNA
  逻辑指示NA是否应获得单独的级别   并使用addNA(*,ifany = TRUE)并为   行动。

作为一种解决方法,我可以将NA替换为FALSE

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

或者我可以使用聚合,但是没有addNA = TRUE等效项:

aggregate(formula = cbind(B, C) ~ A,
          data = x,
          FUN = sum,
          na.rm = TRUE,
          na.action = na.pass)

  A B C
1 Y 1 2
2 Z 0 0

在基本R中获取此表的最直接方法是什么?我在一个只能访问基本R的限制性环境中工作。

是否可以用xtabs来获得此表而无需用NA代替FALSE

1 个答案:

答案 0 :(得分:1)

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