Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:使用函数计算数据帧中特定列的列和为0的行数_R - Fatal编程技术网

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,])