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

如何在R语言中按因子列拆分数据框列并合并为相邻列?

R语言实现按因子列拆分数据框并相邻放置

前提说明

假设你的原始数据框名为df,且因子列TOD的两个水平(Day、Night)对应的行数完全一致(示例中均为5行),以下是几种可行实现方法:


方法1:tidyverse工具链(dplyr + tidyr)

通过添加组内行号,将长格式数据转为宽格式,再调整列顺序:

library(tidyverse)

# 为每个TOD组添加行号,用于后续匹配
df <- df %>%
  group_by(TOD) %>%
  mutate(row_id = row_number()) %>%
  ungroup()

# 转换为宽格式并调整列名与顺序
result <- df %>%
  pivot_wider(
    id_cols = row_id,
    names_from = TOD,
    values_from = c(TOD, Value),
    names_glue = "{.value}_{TOD}"
  ) %>%
  # 重命名列以匹配期望格式
  rename(
    TOD = TOD_Day,
    Value = Value_Day,
    TOD_2 = TOD_Night,
    Value_2 = Value_Night
  ) %>%
  # 保留需要的列并移除行号
  select(TOD, Value, TOD_2, Value_2)

方法2:基础R原生实现

直接拆分数据框后列绑定,逻辑更直观:

# 拆分出Day和Night对应的子数据框
day_data <- subset(df, TOD == "Day")
night_data <- subset(df, TOD == "Night")

# 重命名Night组的列名
colnames(night_data) <- c("TOD_2", "Value_2")

# 列绑定得到结果
result <- cbind(day_data, night_data)

注意:此方法要求两个子数据框行数完全一致,否则会出现循环补齐导致的错误,建议先通过nrow(day_data) == nrow(night_data)验证。


方法3:data.table高效实现

适合处理大型数据集,操作更快速:

library(data.table)

# 转换为data.table格式
setDT(df)
# 按TOD分组添加行号
df[, row_id := .I, by = TOD]

# 转换为宽格式并调整列名
result <- dcast(df, row_id ~ TOD, value.var = c("TOD", "Value"))
setnames(result, 
         old = c("row_id", "TOD_Day", "TOD_Night", "Value_Day", "Value_Night"),
         new = c("row_id", "TOD", "TOD_2", "Value", "Value_2"))

# 保留目标列并移除行号
result <- result[, .(TOD, Value, TOD_2, Value_2)]

内容的提问来源于stack exchange,提问作者Jackson A Swan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:01:20