R语言按多条件统计行数结果异常的问题求助
R语言按多条件统计行数结果异常的问题求助
你好呀!看到你遇到了统计行数结果超出预期的问题,我来帮你分析一下问题出在哪,以及怎么解决~
问题根源:逻辑运算符优先级与条件组合错误
你代码里的逻辑表达式犯了两个关键错误:
- 没有把
ireg的限定条件(必须是1/2/3/7)作为整体和studio的条件绑定,导致很多不符合ireg要求的行被错误统计; - 逻辑运算符的优先级误解:在R中,
&的优先级高于|,所以你写的studio <= 2 & ireg <=3 | ireg ==7会被解析成(studio <=2 & ireg <=3) | ireg ==7——这意味着只要ireg等于7,不管studio的值是什么,都会被计入第一个统计项,这就会把大量不符合studio<=2的行也算进来,甚至不同统计项之间出现重叠,最终导致总计数超过数据集总行数。
正确的解决思路
我们应该先筛选出ireg属于{1,2,3,7}的行,再在这个子集里按studio的四个区间分别统计行数,这样能确保统计的准确性。
方法1:用dplyr分步统计(清晰直观)
如果你习惯用tidyverse风格的代码,可以这样写:
library(dplyr) # 先筛选出ireg符合要求的行 filtered_data <- final_15 %>% filter(ireg %in% c(1, 2, 3, 7)) # 分别统计四个case的行数 num_rows <- c( # 第一个case:studio <=2 nrow(filtered_data %>% filter(studio <= 2)), # 第二个case:3<=studio<=4 nrow(filtered_data %>% filter(studio >=3 & studio <=4)), # 第三个case:studio ==5 nrow(filtered_data %>% filter(studio ==5)), # 第四个case:studio >=6 nrow(filtered_data %>% filter(studio >=6)) ) # 查看结果 num_rows
方法2:用base R实现(无需额外包)
如果你偏好base R的写法,也可以这样:
# 先获取ireg符合要求的行索引 valid_ireg_idx <- final_15$ireg %in% c(1, 2, 3, 7) # 提取筛选后的数据集 filtered_data <- final_15[valid_ireg_idx, ] # 统计各case行数 num_rows <- c( sum(filtered_data$studio <=2), sum(filtered_data$studio >=3 & filtered_data$studio <=4), sum(filtered_data$studio ==5), sum(filtered_data$studio >=6) )
方法3:一次性分组统计(更高效)
如果想更高效地得到带标签的统计结果,可以用case_when分组后直接计数:
library(dplyr) final_15 %>% # 先筛选ireg符合要求的行 filter(ireg %in% c(1,2,3,7)) %>% # 按studio条件分组 mutate(studio_group = case_when( studio <=2 ~ "studio ≤ 2", studio >=3 & studio <=4 ~ "3 ≤ studio ≤ 4", studio ==5 ~ "studio = 5", studio >=6 ~ "studio ≥ 6" )) %>% # 统计每个组的行数 count(studio_group)
这种方法会直接输出每个分组的名称和对应的行数,还能确保每行只被统计一次,不会出现重叠计数的问题。
验证你的原始数据
顺便看了下你提供的样本数据,里面所有行的ireg值都不在{1,2,3,7}范围内,所以按正确方法统计的话,四个case的行数都会是0,这也能解释为什么你原来的代码结果异常——因为错误的逻辑把很多不符合ireg要求的行也统计进去了。
备注:内容来源于stack exchange,提问作者io_boh
相关产品推荐
相关产品推荐

