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

将行标题转换为列并统计值: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:13:44