R:使用函数计算数据框中具有0个colSums的特定列的行数

时间:2014-04-11 09:27:45

标签: r

我的数据框包含n行和mm > 30

我的第一列是age变量,其余的是开启或关闭的医疗条件(二进制)。

现在我想计算没有接通任何医疗条件的观察数量,即健康患者的数量。我想我可以使用rowSums函数来计算观察值,无论行和为零(当然不包括年龄变量),但我尝试了一些函数但没有成功。

这是一个如何工作的例子,但总是涉及很多不实用的AND / OR语句。我一直在寻找一种非循环解决方案。

example <- as.data.frame(matrix(data=c(40,1,1,1,36,1,0,1,56,0,0,1,43,0,0,0), nrow=4, ncol=4, 
byrow=T, dimnames <- list(c("row1","row2","row3", "row4"),c("Age","x","y","z"))))

达到预期结果的两种不切实际的替代方案:

nrow(subset(example, x==0 & y==0 & z==0))
table(example$x==0 & example$y==0 & example$z==0)

我真正想要的是这样的:

nrow(example[rowSums(example[,2:ncol(example)])==0])

2 个答案:

答案 0 :(得分:2)

您可以使用

apply(example[, -1], MARGIN = 1, FUN = function(x) all(x == 0))
##  row1  row2  row3  row4 
## FALSE FALSE FALSE  TRUE 

您要在FUN的每一行应用example[,-1]。它为您提供逻辑向量,指示哪些行满足该行中所有变量等于0的条件。您可以通过在all参数函数中使用FUN函数来实现此目的。

您可以使用此结果获取包含所有健康患者或包含至少1名非健康患者的行。

example[apply(example[, -1], MARGIN = 1, FUN = function(x) all(x == 0)), ]
##      Age x y z
## row4  43 0 0 0

example[!apply(example[, -1], MARGIN = 1, FUN = function(x) all(x == 0)), ]
##      Age x y z
## row1  40 1 1 1
## row2  36 1 0 1
## row3  56 0 0 1

您可以获得健康行数或其他方式

# healthy rows
sum(apply(example[, -1], MARGIN = 1, FUN = function(x) all(x == 0)))
## [1] 1


# rows with atleast one unhealthy condition
sum(!apply(example[, -1], MARGIN = 1, FUN = function(x) all(x == 0)))
## [1] 3

答案 1 :(得分:0)

您只想要满足此条件的观察/行总数吗?然后你可以使用 -

nrow(example[example$x==0 & example$y==0 & example$z==0,])

否则,如果你想使用rowSums,这将有效 -

nrow(example[rowSums(example[,2:4])==0,])