如何将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
相关产品推荐
相关产品推荐

