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

