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

R语言中如何将同ID多行合并为一行并保留测试信息?

解决R语言长表转宽表(标记测试是否存在)的问题

嗨,作为R语言初学者遇到这种数据格式转换的问题太正常啦,这其实是典型的长格式数据转宽格式数据的需求,我给你两种常用的解决方案,都能得到你想要的结果:

第一步:先还原你的原始数据

首先我们先把你提供的data.frame构造出来,方便后续测试:

# 构造原始数据框
df <- data.frame(
  ID = c("1", "1", "2", "2", "3", "4"),
  test = c("testA", "testB", "testA", "testB", "testA", "testB"),
  stringsAsFactors = FALSE
)

方法一:用tidyverse工具包(推荐,灵活易扩展)

tidyverse里的pivot_wider()函数专门用来做长转宽的操作,步骤很清晰:

# 先加载tidyverse包(如果没安装的话先运行 install.packages("tidyverse"))
library(tidyverse)

# 长转宽并填充0/1
df_wide <- df %>%
  mutate(value = 1) %>%  # 给每个已完成的测试标记为1
  pivot_wider(
    id_cols = ID,        # 按ID分组
    names_from = test,   # 把test列的内容作为新的列名
    values_from = value, # 用value列的值填充新列
    values_fill = 0      # 没有对应测试的位置填充0
  )

# 可选:把ID从字符型转成数值型(如果需要的话)
df_wide$ID <- as.numeric(df_wide$ID)

# 查看结果
df_wide

运行后就能得到你想要的输出:

ID testA testB
1  1     1     1
2  2     1     1
3  3     1     0
4  4     0     1

方法二:用基础R的table函数(无需额外装包)

如果你不想加载外部包,用基础R的table()函数也能快速解决:

# 生成ID和test的交叉频数表
table_result <- table(df$ID, df$test)

# 把频数表转成数据框
df_wide_base <- as.data.frame.matrix(table_result)

# 把行名转成ID列
df_wide_base <- tibble::rownames_to_column(df_wide_base, "ID")

# 可选:转换ID为数值型
df_wide_base$ID <- as.numeric(df_wide_base$ID)

# 查看结果
df_wide_base

这个方法的结果和上面完全一致,优点是不用安装额外包,适合快速处理简单需求。

内容的提问来源于stack exchange,提问作者Robby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:13:13