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