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

如何在R语言数据框中按Any列统计字符串频率并生成宽格式结果?

解决方案:将长格式数据转为按年份分组的频率宽格式

没问题!你需要把长格式的df1转换为按nomMun分组、每年频率作为列的宽格式数据框,这里有几种实用的R解决方案,根据你习惯的工具包来选择:

1. 用你提到的plyr结合reshape2实现

既然你已经了解plyr的count函数,我们可以先分组统计频率,再转换为宽格式:

# 先加载所需包
library(plyr)
library(reshape2)

# 构造示例数据(和你提供的一致)
df1 <- data.frame(
  Any = c(2010, 2011, 2012, 2010, 2011, 2012),
  nomMun = c("CADAQUES", "CADAQUES", "CADAQUES", "BEGUR", "BEGUR", "BEGUR"),
  stringsAsFactors = FALSE
)

# 第一步:按nomMun和年份分组统计频率
count_df <- count(df1, c("nomMun", "Any"))

# 第二步:转换为宽格式,并给年份列加上freq_前缀
df2 <- dcast(count_df, nomMun ~ Any, value.var = "freq")
colnames(df2)[-1] <- paste0("freq_", colnames(df2)[-1])

运行后得到的df2就是你想要的格式:

df2
nomMun freq_2010 freq_2011 freq_2012
1 CADAQUES 1 1 1
2 BEGUR 1 1 1

2. 用现代tidyverse工具(推荐)

如果你习惯用dplyr和tidyr(现在R数据分析的主流工具),代码会更简洁直观:

library(dplyr)
library(tidyr)

df2 <- df1 %>%
  # 按nomMun和年份分组,统计每组的行数(即频率)
  count(nomMun, Any, name = "freq") %>%
  # 直接转换为宽格式,自动给年份列加上freq_前缀
  pivot_wider(names_from = Any, values_from = freq, names_prefix = "freq_")

这个方法一步到位,不需要额外的列名修改,逻辑也更清晰。

3. 用data.table处理大数据

如果你的数据集很大,data.table的效率会更高:

library(data.table)

# 将数据框转为data.table格式
setDT(df1)

df2 <- df1[, .(freq = .N), by = .(nomMun, Any)] %>%
  dcast(nomMun ~ paste0("freq_", Any), value.var = "freq")

补充说明

这些方法都能正确处理更复杂的情况:比如如果某个nomMun在某一年出现多次,统计结果会自动显示对应的频率(比如出现2次就会显示2)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:08:47