如何对长数据进行Pivot转换,同时不重复保留前若干行?
R语言数据框结构转换实现
原始数据框
df <- data.frame(col1=c(NA,NA,NA,NA, 'A', 'B'), col2=c('year1', 'year2', 'year3', 'year4', 10,20))
目标结构
df <- data.frame(col1=c( 'A', 'B'), col2=c( 'year1', 'year1'), col3=c( 'year2', 'year2'), col4=c( 'year3', 'year3'), col5=c( 'year4', 'year4'), col6=c( 10, 20))
实现方案
核心思路是拆分原始数据中的年份标识与实际数据,将年份转为列并重复匹配实际数据行数,最终合并成目标结构。以下提供两种实现方式:
方式一:Base R 实现
# 提取前4行的年份值 year_values <- df$col2[1:4] # 提取后2行的实际数据 core_data <- df[5:6, ] # 生成年份对应的列,每个年份重复2次匹配两行数据 year_columns <- as.data.frame(matrix(rep(year_values, each = 2), nrow = 2)) # 给年份列命名 colnames(year_columns) <- paste0("col", 2:5) # 合并所有列得到结果 final_df <- cbind( col1 = core_data$col1, year_columns, col6 = core_data$col2 )
方式二:Tidyverse 实现
library(tidyverse) # 提取年份值 year_values <- df$col2[1:4] final_df <- df[5:6, ] %>% select(col1) %>% mutate( col2 = year_values[1], col3 = year_values[2], col4 = year_values[3], col5 = year_values[4], col6 = df$col2[5:6] )
运行任意一种方式后,final_df 即为目标结构的数据框。
内容的提问来源于stack exchange,提问作者dk1
相关产品推荐
相关产品推荐

