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

如何用pivot_longer对多组成对列的宽数据集进行转长处理?

R宽格式转长格式:成对列转换方案

原始宽格式数据

代码定义:

df <- data.frame(
  Pseudonym = c("aa", "bb"),
  KE_date_1 = c("2022-04-01", "2022-04-03"),
  KE_content_2 = c("high pot", "high pot"),
  KE_date_3 = c("2022-08-01", "2022-08-04"),
  KE_content_4 = c("high pot return", "high pot return")
)

对应表格:

PseudonymKE_date_1KE_content_2KE_date_3KE_content_4
aa2022-04-01high pot2022-08-01high pot return
bb2022-04-03high pot2022-08-04high pot return

目标长格式数据

代码定义:

df2 <- data.frame(
  Pseudonym = c("aa", "aa", "bb", "bb"),
  KE_date = c("2022-04-01", "2022-08-01", "2022-04-03", "2022-08-04"),
  KE_content = c("high pot", "high pot return", "high pot", "high pot return")
)

对应表格:

PseudonymKE_dateKE_content
aa2022-04-01high pot
aa2022-08-01high pot return
bb2022-04-03high pot
bb2022-08-04high pot return

解决方案

方法一:使用tidyverse工具(推荐)

利用purrr的map2函数匹配成对的日期和内容列,再合并结果:

library(tidyverse)

# 提取所有日期列和内容列
date_cols <- df %>% select(starts_with("KE_date"))
content_cols <- df %>% select(starts_with("KE_content"))

# 按组转换并合并
df_long <- bind_rows(
  map2(date_cols, content_cols, ~ tibble(KE_date = .x, KE_content = .y))
) %>%
  bind_cols(Pseudonym = rep(df$Pseudonym, ncol(date_cols))) %>%
  select(Pseudonym, KE_date, KE_content)

方法二:Base R原生实现

无需加载外部包,通过循环遍历成对列实现转换:

# 获取日期列和内容列的索引
date_idx <- grep("KE_date", names(df))
content_idx <- grep("KE_content", names(df))

# 初始化结果数据框
df_long <- data.frame(Pseudonym = character(), KE_date = character(), KE_content = character())

# 遍历每一组列并拼接
for (i in seq_along(date_idx)) {
  temp_df <- data.frame(
    Pseudonym = df$Pseudonym,
    KE_date = df[[date_idx[i]]],
    KE_content = df[[content_idx[i]]]
  )
  df_long <- rbind(df_long, temp_df)
}

# 重置行名
rownames(df_long) <- NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:12:12