如何在R语言中按条件统计DataFrame的行数?
在R中按条件统计DataFrame行数的方法
没问题呀,新手问题完全不用客气~下面我给你介绍几种在R里按条件统计数据框行数的常用方法,结合你的数据来举例,一看就懂:
第一步:先构造你的测试数据
首先我们把你提供的数据转换成R可直接运行的数据框,方便后续测试:
df <- data.frame( order_id = c(1,1,1,36,36,36,36,38,38,38,38,96,96,96), department_id = c(4,15,16,4,7,16,20,1,4,13,19,1,4,20), department = c("produce", "canned goods", "dairy eggs", "produce", "beverages", "dairy eggs", "deli", "frozen", "produce", "pantry", "snacks", "frozen", "produce", "deli"), n = c(4,1,3,3,1,3,1,1,6,1,1,2,4,1) )
方法一:基础R实现(无需额外包)
1. 使用nrow() + subset()
这种方法逻辑直观,适合初学者理解:
- 单条件统计:比如统计
order_id为1的行数
nrow(subset(df, order_id == 1)) # 结果是3
- 多条件统计:比如统计
department是"produce"且n大于3的行数
nrow(subset(df, department == "produce" & n > 3)) # 结果是3(order_id 1、38、96的produce行)
2. 使用逻辑索引求和(更高效)
R中逻辑值TRUE会被视为1,FALSE视为0,用sum()可以直接统计符合条件的行数,大数据框下比subset()更快:
- 单条件:统计
department_id为4的行数
sum(df$department_id == 4) # 结果是4
- 多条件:统计
order_id是36且department不是"produce"的行数
sum(df$order_id == 36 & df$department != "produce") # 结果是3
方法二:tidyverse/dplyr实现(更简洁的管道风格)
如果你习惯用tidyverse生态,dplyr的语法会更流畅,先确保安装并加载包:
install.packages("dplyr") # 首次使用需安装 library(dplyr)
1. 单条件/多条件统计
用filter()筛选符合条件的行,再用tally()统计行数:
- 统计
n等于1的行数
df %>% filter(n == 1) %>% tally() # 结果是7
- 多条件:统计
order_id为96且department是"frozen"或"deli"的行数
df %>% filter(order_id == 96, department %in% c("frozen", "deli")) %>% tally() # 结果是2
2. 分组统计行数
如果需要按某个字段分组统计每组的行数(比如每个订单下的品类数量),用group_by() + tally():
df %>% group_by(order_id) %>% tally()
运行后会得到每个order_id对应的行数,比如order_id=1有3行,order_id=36有4行等。
内容的提问来源于stack exchange,提问作者Gaurang Swarge
相关产品推荐
相关产品推荐

