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

使用多列生成频率表时出错的技术求助

问题:多列生成“是”(1=是)的频率表

需从大数据集中筛选指定列,转换为长格式后,统计仅回答“是”(注:1=是,2=否)的频率表。

数据结构

subject_idleq_1_enleq_2_enleq_3_enleq_4_en
191-54672211
191-67841122
191-34571122
191-09871122
191-12451111
191-23651221
191-45892111
191-98741111
191-23462211
191-12561111
191-67842111
191-67841111
191-67841111
191-67841111

期望输出

VariableFrequency
leq_1_en10
leq_2_en11
leq_3_en9
leq_4_en11

已尝试代码及报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:40:30