R语言入门求助:如何统计数据框每列各值的出现次数?
统计数据框每列各值出现次数的方法
首先构造你提供的示例数据,方便测试:
my.data <- data.frame( Column_A = c("YES", "YES", "NO", "YES", "NO"), Column_B = c("NO", "MAYBE", "NO", "NO", "NO"), Column_C = c("NO", "MAYBE", "YES", "YES", "YES"), stringsAsFactors = FALSE )
你用table(my.data)报错是因为这个函数默认生成列间交叉频数表,当列的取值组合过多时会导致计算量爆炸,而你需要的是每列单独的频次统计,所以要按列处理。
方法一:基础R实现(无需额外包)
# 遍历每一列计算频次 freq_list <- lapply(my.data, table) # 统一所有列的取值水平,缺失值补0 all_levels <- c("YES", "MAYBE", "NO") result_df <- do.call(cbind, lapply(freq_list, function(x) { as.integer(ifelse(is.na(x[all_levels]), 0, x[all_levels])) })) # 设置行名 rownames(result_df) <- all_levels
运行后result_df就是你想要的结果:
Column_A Column_B Column_C YES 3 0 3 MAYBE 0 1 1 NO 2 4 1
方法二:tidyverse工具链实现(更易读)
如果你习惯用tidyverse的语法,可结合dplyr和tidyr:
library(dplyr) library(tidyr) result_df <- my.data %>% # 宽格式转长格式,统一统计频次 pivot_longer(everything(), names_to = "Column", values_to = "Value") %>% # 按列和取值统计次数 count(Column, Value) %>% # 转回宽格式,缺失频次补0 pivot_wider(names_from = Column, values_from = n, values_fill = 0) %>% # 按指定顺序排序行 arrange(factor(Value, levels = c("YES", "MAYBE", "NO"))) # 可选:将Value列转为行名 rownames(result_df) <- result_df$Value result_df <- result_df %>% select(-Value)
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

