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

在R语言中基于两个变量生成计数表

问题描述

我有如下data.frame数据框:

> dput(df)
structure(list(Fruit_Type = c("Apple", "Banana", "Apple", "Peach", 
"Peach"), Store_Bought = c("Walmart", "Walmart", "Aldi", "Walmart", 
"Walmart")), class = "data.frame", row.names = c(NA, -5L))

希望按购买商店统计每种水果类型的数量,预期输出如下:

> dput(df2)
structure(list(Fruit_Type = c("Apple", "Apple", "Banana", "Peach"
), Frequency = c(1L, 1L, 1L, 2L), Store.Bought = c("Walmart", 
"Aldi", "Walmart", "Walmart")), class = "data.frame", row.names = c(NA, 
-4L))

解决方案

方法1:使用dplyr包(推荐)

通过分组后统计行数,再调整列名匹配预期输出:

library(dplyr)

df2 <- df %>%
  group_by(Fruit_Type, Store_Bought) %>%
  tally(name = "Frequency") %>%
  ungroup() %>%
  rename(Store.Bought = Store_Bought)

# 验证结果
dput(df2)

方法2:基础R实现

无需额外包,用aggregate函数完成统计:

# 按水果类型和商店分组统计行数
freq_df <- aggregate(. ~ Fruit_Type + Store_Bought, data = df, FUN = length)

# 调整列名和顺序
df2 <- freq_df %>%
  rename(Frequency = Store_Bought.1, Store.Bought = Store_Bought) %>%
  select(Fruit_Type, Frequency, Store.Bought)

dput(df2)

或者用table函数生成频数表后转换为数据框:

# 生成交叉频数表
freq_table <- table(df$Fruit_Type, df$Store_Bought)

# 转换为数据框并过滤无购买的组合
df2 <- as.data.frame(freq_table, responseName = "Frequency") %>%
  rename(Fruit_Type = Var1, Store.Bought = Var2) %>%
  filter(Frequency > 0)

dput(df2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:23:15