如何统计R数据框中Org_name与Symbol的关联频次?
解决方案
方法1:使用tidyverse工具链(推荐)
先加载tidyverse包,通过分组计数、补全缺失组合、转宽格式三步实现需求,最后调整列名和数据类型匹配预期结果:
library(tidyverse) # 原始数据框 df <- data.frame(Org_name = c("A", "B", "C", "D", "A", "D", "C", "B"), Symbol = c("F", "P", "X", "F", "F", "O", "O", "P")) df1 <- df %>% count(Org_name, Symbol, name = "freq") %>% # 按组织和符号分组统计频次 complete(Org_name, Symbol, fill = list(freq = 0)) %>% # 补全所有组织-符号组合,缺失项填0 pivot_wider(names_from = Symbol, values_from = freq) %>% # 转换为宽格式 select(Org_name, F, P, O, X) %>% # 调整列顺序 rename(F_freq = F, P_freq = P, O_freq = O, X_freq = X) %>% # 重命名列 mutate(across(-Org_name, as.character)) # 将频次列转为字符型 print(df1)
方法2:使用Base R(无需额外包)
利用基础R的table()生成交叉频次表,再转换为数据框并调整格式:
df <- data.frame(Org_name = c("A", "B", "C", "D", "A", "D", "C", "B"), Symbol = c("F", "P", "X", "F", "F", "O", "O", "P")) # 生成组织-符号的交叉频次表 freq_table <- table(df$Org_name, df$Symbol) # 转换为数据框并调整格式 df1 <- as.data.frame.matrix(freq_table) df1$Org_name <- rownames(df1) df1 <- df1[, c("Org_name", "F", "P", "O", "X")] # 调整列顺序 names(df1)[-1] <- paste0(names(df1)[-1], "_freq") # 给频次列加后缀 df1[, -1] <- lapply(df1[, -1], as.character) # 转为字符型 rownames(df1) <- NULL # 清除行名 print(df1)
两种方法运行后都会得到你期望的结果。
内容的提问来源于stack exchange,提问作者Traitor Legions
相关产品推荐
相关产品推荐

