R:使用函数计算数据帧中特定列的列和为0的行数
我有一个包含R:使用函数计算数据帧中特定列的列和为0的行数,r,R,我有一个包含n行和m列的数据框,其中m>30 我的第一列是一个age变量,其余是打开或关闭(二进制)的医疗条件 现在我想计算没有打开任何医疗条件的观察次数,即健康患者的数量。我原以为只要行和为零(当然不包括年龄变量),就可以使用rowSums函数计算观察值,但我尝试了一些函数,但没有成功 下面是一个例子,说明它是如何工作的,但总是涉及大量不实用的和/或语句。我在寻找一个非循环的解决方案 example <- as.data.frame(matrix(data=c(40,1,1,1,36,1
n
行和m
列的数据框,其中m>30
我的第一列是一个age
变量,其余是打开或关闭(二进制)的医疗条件
现在我想计算没有打开任何医疗条件的观察次数,即健康患者的数量。我原以为只要行和为零(当然不包括年龄变量),就可以使用rowSums
函数计算观察值,但我尝试了一些函数,但没有成功
下面是一个例子,说明它是如何工作的,但总是涉及大量不实用的和/或语句。我在寻找一个非循环的解决方案
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(example[rowSums(example[,2:ncol(example)])==0])
你可以用
apply(example[, -1], MARGIN = 1, FUN = function(x) all(x == 0))
## row1 row2 row3 row4
## FALSE FALSE FALSE TRUE
在这里,您将对示例[,-1]
的每一行应用FUN
。它提供逻辑向量,指示哪些行满足该行中所有变量均等于0的条件。您可以通过在FUN
参数函数中使用all
函数来实现这一点
您可以使用此结果获取包含所有健康患者或至少包含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
您只需要满足此条件的观察/行的总数,对吗?然后你可以用-
nrow(example[example$x==0 & example$y==0 & example$z==0,])
否则,如果要使用行和,这将起作用-
nrow(example[rowSums(example[,2:4])==0,])
rowSums
可以这样做:rowSums(示例[,-1])
给出每行“医疗状况”的数量,sum(示例[,-1])==0)
给出所有医疗状况都0
的行数。如果某些单元格中可能存在na值,请在行和中使用na.rm=TRUE
。我知道这很简单。没有考虑行和的总和。谢谢!顺便说一句,如果嵌套代码没有像您预期的那样工作,请尝试从内到外逐点计算它。例如,对于您的nrow(示例[行总和(示例[,2:ncol(示例)])=0])
,您可以尝试(1)example[,2:ncol(示例)]
,(2)行总和(示例[,2:ncol(示例)])
,(3)行总和(示例[,2:ncol(示例)]==0
,(4)示例[行总和(示例[,2:ncol(示例)]=0]
,最后(5)nrow(示例[行和(示例[,2:ncol(示例)])==0])
。您会发现步骤4返回一个4行数据帧,您只对值为1的行感兴趣<代码>nrow
不足。谢谢!我仍然需要习惯于分解我的想法进行调试。注意,对于大型矩阵,这比rowSums
慢得多。对于100000 x 10矩阵,microbenchmark
建议286毫秒,而不是3毫秒。@jbaums:我同意它可能会慢一些,我的目的是为这个问题提供更通用的解决方案。重点是,对于清晰详细的答案+1。哇,这很强大。虽然每行都有循环,但我喜欢它的灵活性。当然,在我的数据帧中会慢得多:-)
nrow(example[rowSums(example[,2:4])==0,])