在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
相关产品推荐
相关产品推荐

