R语言按Cancer分组并转置输出癌症对应频率的实现方法
R 按Cancer字段分组转置为宽表的实现方案
针对两列结构数据集(Cancer列存储各类癌症名称、Frequency列存储对应关联频率),需要生成“每类癌症为独立列、列下对应展示关联频率值”的宽表,可根据使用习惯选择以下可直接复用的实现方式:
基础R原生实现(无需安装第三方包)
依托基础包自带函数完成转置,适合轻量无依赖的使用场景:
# 模拟原始数据结构,可直接替换为实际读取的数据源 raw_data <- data.frame( Cancer = c("CNS-PiloAstro", "Eso-AdenoCa", "ColoRect-AdenoCA", "Liver-HCC"), Frequency = c(0.14, 0.09, 0.22, 0.17) ) # 转置为目标宽表 wide_data <- as.data.frame.matrix( xtabs(Frequency ~ Cancer, data = raw_data) ) |> t() |> as.data.frame()
执行完成后,所有癌症名称会自动识别为新表的列名,列下自动匹配填充对应频率值。
tidyverse生态实现(可读性优先)
使用tidyr包的pivot_wider函数(R官方推荐的长转宽标准写法),逻辑直观易维护:
# 首次使用执行安装 install.packages(c("tidyr", "dplyr")) library(tidyr) library(dplyr) # 核心转置逻辑 wide_data <- raw_data |> pivot_wider( names_from = Cancer, # 将Cancer列的所有取值作为新表列名 values_from = Frequency # 对应列下填充匹配的Frequency值 )
注意:如果原始数据存在同一癌症名称对应多个Frequency值的情况,可补充参数values_fn = list(Frequency = ~mean(.x))指定聚合规则,避免函数报错。
data.table实现(大数据量场景优先)
如果原始数据规模达到百万行以上,该方法的运行性能比前两种方式高一个数量级:
# 首次使用执行安装 install.packages("data.table") library(data.table) # 转换为data.table格式并完成转置 setDT(raw_data) wide_data <- dcast(raw_data, . ~ Cancer, value.var = "Frequency") # 移除自动生成的无意义主键列 wide_data[, `.` := NULL]
内容的提问来源于stack exchange,提问作者Al Deng
相关产品推荐
相关产品推荐

