我有以下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