R语言统计col1缺失且col2="USA"的行数问题求解
Hey there! Let's get this sorted out for you—totally get being stuck when you're new to R, especially coming from Stata where the syntax feels a bit different.
为什么你的原代码无效?
你写的sum(is.na(df$col1), df$col2=="USA")其实是误用了sum()函数的参数。在R里,sum()的第二个参数是用来设置na.rm(是否忽略缺失值)的,不是用来添加第二个逻辑条件的。所以这个代码实际上是在计算col1缺失的行数加上col2等于"USA"的行数,而不是同时满足两个条件的行数,这就和你想要的结果差远啦。
正确的解决方法
这里有两种常用的方式,你可以选适合自己的:
1. 基础R方法(直接用逻辑与)
用&把两个条件结合起来,生成一个只标记同时满足条件的逻辑向量,再用sum()统计其中TRUE的数量(因为R会把TRUE当作1,FALSE当作0):
sum(is.na(df$col1) & df$col2 == "USA")
如果你的数据里col2存在NA值,df$col2 == "USA"会返回NA,这时候可以加上na.rm = TRUE忽略这些干扰项:
sum(is.na(df$col1) & df$col2 == "USA", na.rm = TRUE)
2. tidyverse/dplyr方法(更直观的筛选计数)
如果你习惯用tidyverse工具包,用filter()筛选出符合条件的行,再用nrow()统计行数,可读性更强:
library(dplyr) df %>% filter(is.na(col1), col2 == "USA") %>% nrow()
这里的逗号就相当于逻辑与,和Stata里的&作用完全一致哦。
补充说明(和Stata的对应)
你提到的Stata代码count if col1=="" & col2=="USA",要注意:在Stata里空字符串""代表缺失值,但在R里,字符型的缺失值是NA,而非""。如果你的col1里的"缺失值"其实是空字符串""(不是真正的NA),那你需要把is.na(df$col1)换成df$col1 == "",代码就变成:
sum(df$col1 == "" & df$col2 == "USA")
内容的提问来源于stack exchange,提问作者Valentina Ruts

