You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何按每组应答次数为条件对DataFrame进行子集筛选

错误原因

respfreq是长度为56的用户级命名向量,每个元素对应一个唯一用户的应答次数,元素名是对应用户的小写编号;而原始数据集Morning_Afternoon_PT_EN是485行的问卷级数据,每一行对应一次问卷填写记录,同一个用户会对应多行数据,二者长度不匹配,因此无法直接用respfreq>6作为逐行筛选的条件。

解决方法

方法1:基础R实现

利用respfreq是命名向量的特性,将原始数据每行的用户编号转小写后作为索引,匹配到对应用户的应答次数,再做筛选:

# 写法1:基础索引筛选
valid_rows <- respfreq[tolower(Morning_Afternoon_PT_EN$code)] > 6
NewDataFrame <- Morning_Afternoon_PT_EN[valid_rows, ]

# 写法2:subset函数实现
NewDataFrame <- subset(Morning_Afternoon_PT_EN, respfreq[tolower(code)] > 6)

方法2:dplyr实现(可读性更高)

通过分组统计每个用户的应答次数后直接筛选,不需要提前计算respfreq:

library(dplyr)

NewDataFrame <- Morning_Afternoon_PT_EN %>%
  mutate(code = tolower(code)) %>% # 统一编号大小写避免匹配问题
  group_by(code) %>% # 按用户分组
  mutate(resp_count = sum(!is.na(day))) %>% # 统计当前用户的有效应答次数
  filter(resp_count >= 6) %>% # 保留符合要求的用户的所有行
  ungroup() %>% # 取消分组
  select(-resp_count) # 可选:删除临时统计列

结果验证

筛选完成后可以运行以下代码确认用户数是否符合预期:

# 预期返回值为50:原56个用户,剔除6个不符合要求的用户
length(unique(tolower(NewDataFrame$code)))

内容的提问来源于stack exchange,提问作者Francisca_C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:24:06