如何在R语言中实现指定数据重塑:将变量拆分到多列
在R中实现数据框的重塑(宽转长+长转宽组合操作)
我来帮你搞定这个数据重塑的需求,在R里用现代的tidyverse工具包就能轻松实现,当然也可以用base R的方法,下面是具体步骤和可直接运行的代码:
第一步:构造原始测试数据
先把你给出的原始数据框构造出来,方便后续测试:
df <- data.frame( A = c("a", "d", "k", "k"), B = c(2015, 2016, 2016, 2018), C = c(1, 2, 2, 3), D = c(2, 3, 4, 6), stringsAsFactors = FALSE )
方法一:使用tidyverse(推荐,代码更直观)
tidyverse里的pivot_longer和pivot_wider是处理数据重塑的黄金组合,步骤清晰:
- 先把
C、D这两列转成长格式,生成value列用来标识是C还是D,同时把对应的值存入val列; - 再把年份列
B转成宽格式,让年份成为单独的列,对应填入之前的val值。
代码如下:
# 先加载tidyverse包(如果没安装先运行install.packages("tidyverse")) library(tidyverse) # 执行重塑操作 result <- df %>% pivot_longer(cols = c(C, D), names_to = "value", values_to = "val") %>% pivot_wider(names_from = B, values_from = val) # 查看最终结果 print(result)
运行后得到的结果和你要的目标格式完全一致,空值会自动显示为NA,符合需求。
方法二:使用base R的reshape函数
如果你不想加载额外包,也可以用base R自带的reshape函数,步骤类似但代码稍繁琐:
# 第一步:转长格式 melted_df <- reshape(df, direction = "long", varying = c("C", "D"), v.names = "val", timevar = "value", times = c("C", "D")) # 第二步:转宽格式 result_base <- reshape(melted_df, direction = "wide", idvar = c("A", "value"), timevar = "B") # 调整列名和顺序,让结果更贴合目标格式 names(result_base) <- gsub("val\\.", "", names(result_base)) result_base <- result_base[, c("A", "value", "2015", "2016", "2018")] row.names(result_base) <- NULL # 查看结果 print(result_base)
结果说明
两种方法最终都会输出你需要的结构:
# A tibble: 8 × 4 A value `2015` `2016` `2018` <chr> <chr> <dbl> <dbl> <dbl> 1 a C 1 NA NA 2 a D 2 NA NA 3 d C NA 2 NA 4 d D NA 3 NA 5 k C NA 2 3 6 k D NA 4 6
内容的提问来源于stack exchange,提问作者VIX
相关产品推荐
相关产品推荐

