使用多列生成频率表时出错的技术求助
问题:多列生成“是”(1=是)的频率表
需从大数据集中筛选指定列,转换为长格式后,统计仅回答“是”(注:1=是,2=否)的频率表。
数据结构
| subject_id | leq_1_en | leq_2_en | leq_3_en | leq_4_en |
|---|---|---|---|---|
| 191-5467 | 2 | 2 | 1 | 1 |
| 191-6784 | 1 | 1 | 2 | 2 |
| 191-3457 | 1 | 1 | 2 | 2 |
| 191-0987 | 1 | 1 | 2 | 2 |
| 191-1245 | 1 | 1 | 1 | 1 |
| 191-2365 | 1 | 2 | 2 | 1 |
| 191-4589 | 2 | 1 | 1 | 1 |
| 191-9874 | 1 | 1 | 1 | 1 |
| 191-2346 | 2 | 2 | 1 | 1 |
| 191-1256 | 1 | 1 | 1 | 1 |
| 191-6784 | 2 | 1 | 1 | 1 |
| 191-6784 | 1 | 1 | 1 | 1 |
| 191-6784 | 1 | 1 | 1 | 1 |
| 191-6784 | 1 | 1 | 1 | 1 |
期望输出
| Variable | Frequency |
|---|---|
| leq_1_en | 10 |
| leq_2_en | 11 |
| leq_3_en | 9 |
| leq_4_en | 11 |
已尝试代码及报错
data %>% select(leq_1_en, leq_2_en, leq_3_en,leq_4_en) %>% pivot_longer (., names_pattern = "([A-z]+)", names_to = c("groups")) %>% drop_na(value) %>% group_by(groups) %>% count(value)
报错信息:
Error in `$<-.data.frame`(`*tmp*`, "call_text", value = c("... %>% count(value)", : replacement has 5 rows, data has 3
解决方法
方法1:修正tidyverse流程
原代码问题:pivot_longer的names_pattern设置多余(无需提取匹配组,直接用列名即可),且未筛选“是”(value=1)的记录,最后统计的是所有value的计数而非仅“是”的频率。修正后代码:
library(tidyverse) data %>% select(leq_1_en, leq_2_en, leq_3_en, leq_4_en) %>% # 筛选目标列 pivot_longer(cols = everything(), names_to = "Variable", values_to = "Response") %>% # 转长格式 filter(Response == 1) %>% # 仅保留“是”的记录 group_by(Variable) %>% # 按变量分组 summarise(Frequency = n()) %>% # 统计每组数量 arrange(Variable) # 按变量名排序(与期望输出对齐)
方法2:使用apply函数
用base R的apply直接统计每列中“是”的数量:
# 筛选目标列 target_cols <- data[, c("leq_1_en", "leq_2_en", "leq_3_en", "leq_4_en")] # 统计每列中1的数量 freq_counts <- apply(target_cols, 2, function(x) sum(x == 1, na.rm = TRUE)) # 转换为数据框并调整列名 result_df <- data.frame(Variable = names(freq_counts), Frequency = as.numeric(freq_counts)) # 按变量名排序(与期望输出对齐) result_df <- result_df[order(result_df$Variable), ]
内容的提问来源于stack exchange,提问作者Thandi
相关产品推荐
相关产品推荐

