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

如何将R语言数据框中多列伙伴数据合并为单列并重复对应ID行?

解决R语言宽格式转长格式(合并伙伴列并生成重复行)

方法1:使用tidyverse的pivot_longer(推荐)

这是tidyverse生态下的标准方法,代码简洁易读:

# 加载包
library(tidyverse)

# 处理数据
df2 <- df1 %>%
  pivot_longer(
    cols = starts_with("partner_"), # 指定要转换的目标列
    names_to = NULL, # 无需保留原列名
    values_to = "partner", # 新列的名称
    values_drop_na = TRUE # 自动剔除NA值
  )

# 查看结果
df2

运行后输出:

# A tibble: 7 × 2
  id    partner
  <chr> <chr>  
1 B     C      
2 B     J      
3 D     L      
4 M     K      
5 M     E      
6 M     O      
7 S     P      

方法2:使用Base R的reshape函数

如果不想加载第三方包,可直接用Base R自带的函数:

# 转换格式
df2 <- reshape(
  df1,
  direction = "long",
  varying = list(c("partner_1", "partner_2", "partner_3")),
  v.names = "partner",
  idvar = "id",
  times = NULL
)

# 移除NA值并整理行名
df2 <- df2[!is.na(df2$partner), ]
row.names(df2) <- NULL

# 查看结果
df2

输出结果:

id partner
1  B       C
2  B       J
3  D       L
4  M       K
5  M       E
6  M       O
7  S       P

方法3:使用data.table的melt(适合大数据量)

若处理的数据集规模较大,data.table的方法执行效率更高:

# 加载包
library(data.table)

# 转换为data.table并处理
setDT(df1)
df2 <- melt(
  df1,
  id.vars = "id",
  measure.vars = patterns("^partner_"),
  value.name = "partner",
  na.rm = TRUE
)[, variable := NULL] # 移除不需要的辅助列

# 若需要与目标完全一致的行顺序,可添加排序
df2 <- df2[order(id)]

# 查看结果
df2

输出结果:

id partner
1:  B       C
2:  B       J
3:  D       L
4:  M       K
5:  M       E
6:  M       O
7:  S       P

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.09 06:12:32