将行标题转换为列并统计值:DataFrame列值计数实现问题
解决TER列取值计数的问题
问题回顾
你有这样一个数据集:
ID Fig1 Fig2 TER1 TER2 TER3 ERT-1 50 25 A A C ERT-2 80 35 B C B ERT-5 10 75 C C A
想要统计TER1、TER2、TER3每列中A、B、C的出现次数,目标结果是:
XYZ A B C TER1 1 1 1 TER2 1 0 2 TER3 1 1 1
之前尝试dcast没成功,其实是没走对数据转换的流程,下面给你两种靠谱的实现方法:
方法一:用tidyverse(dplyr + tidyr)实现
这个方法步骤清晰,适合习惯tidy风格的用户:
library(tidyverse) # 假设你的原始数据框名为df final_df <- df %>% # 只保留TER开头的列,过滤掉不需要的ID、Fig列 select(starts_with("TER")) %>% # 将宽格式转为长格式,列名存为XYZ,取值存为value pivot_longer(cols = everything(), names_to = "XYZ", values_to = "value") %>% # 按列名和取值分组,统计每组的数量 count(XYZ, value) %>% # 转回宽格式,缺失的计数用0填充 pivot_wider(names_from = value, values_from = n, values_fill = 0)
方法二:用data.table的melt + dcast
既然你尝试过dcast,那用data.table的这套组合拳应该更顺手:
library(data.table) # 将数据转为data.table对象 setDT(df) # 先melt拆分TER列,再用dcast统计计数 final_df <- dcast( melt(df, measure.vars = patterns("^TER"), variable.name = "XYZ"), XYZ ~ value, fun.aggregate = length, fill = 0 )
这两种方法都能精准得到你想要的结果,核心逻辑都是先把宽表转成便于统计的长表,统计完再转回目标宽表格式。
内容的提问来源于stack exchange,提问作者Roy1245
相关产品推荐
相关产品推荐

