R语言向量子集值遍历失败,求助作答次数统计实现
统计受访者作答次数的R实现方案
嗨,别担心基础问题!刚接触R的时候遇到这类数据处理需求太正常啦~针对你要统计每个受访者6个月内作答次数(评分>0即算作答)的需求,我给你几个简单易懂的实现方法,都是新手也能快速上手的:
方法1:用基础R的rowSums(最简洁)
假设你的数据集叫df,已经筛选出了6个月的评分变量(比如列名是month1到month6),直接用rowSums就能按行统计符合条件的数量,还能自动忽略未作答的NA值:
# 替换成你实际的列名或列位置 df$response_count <- rowSums(df[, c("month1", "month2", "month3", "month4", "month5", "month6")] > 0, na.rm = TRUE)
- 解释:
df[, 列范围] > 0会生成一个布尔矩阵(符合条件的为TRUE,否则FALSE),rowSums会把每行的TRUE(等价于1)加起来,na.rm = TRUE是为了忽略未作答的缺失值(NA),避免结果变成NA。
方法2:用apply函数(更灵活)
如果需要自定义更多逻辑,apply函数会更灵活,同样按行处理:
# 按行遍历选中的列,统计每个行里>0的元素数量 df$response_count <- apply(df[, month1:month6], # 这里直接用列名范围选中所有月份评分列 MARGIN = 1, # MARGIN=1代表按行操作,=2是按列 FUN = function(x) sum(x > 0, na.rm = TRUE))
方法3:用tidyverse工具链(适合数据清洗流水线)
如果你习惯用dplyr这类tidyverse包,可以用管道语法实现,代码可读性更高:
library(dplyr) df <- df %>% rowwise() %>% # 开启按行处理模式 mutate( response_count = sum(c_across(month1:month6) > 0, na.rm = TRUE) # c_across(month1:month6) 选中所有月份的评分列 ) %>% ungroup() # 关闭按行模式,恢复常规数据框操作
小提醒:
如果你的未作答数据不是NA,而是直接填了0,那可以去掉na.rm = TRUE,因为0>0会返回FALSE,不会被统计进去;但如果未作答是缺失值NA,一定要加上这个参数哦!
内容的提问来源于stack exchange,提问作者Lemexis
相关产品推荐
相关产品推荐

