如何基于行值创建新变量重塑R数据框以满足数据分析需求
实现方法
你需要的是宽表转长表的操作,保留A、B两列固定,将C、D两列拉伸为行,对应生成存储列名的var列和存储取值的res列,两种常用实现方式如下:
方法1:tidyverse 方案(推荐,代码简洁易读)
使用tidyr包的pivot_longer函数实现:
# 加载包,如果未安装先运行 install.packages("tidyr") library(tidyr) olddf <- data.frame('A' = c('Z1','Z2','Z3'), 'B' = c(100, 200, 500), 'C' = c(90, 50, 60), 'D' = c(NA, 50, NA)) newdf <- pivot_longer(olddf, cols = c(C, D), # 指定需要转长格式的列,也可以写 cols = -c(A,B) 自动排除固定列 names_to = "var", # 存储原列名的新列名 values_to = "res") # 存储原取值的新列名
运行后得到的newdf和你示例的结构完全一致。
方法2:base R 方案(无需安装额外包)
使用内置reshape函数实现:
olddf <- data.frame('A' = c('Z1','Z2','Z3'), 'B' = c(100, 200, 500), 'C' = c(90, 50, 60), 'D' = c(NA, 50, NA)) newdf <- reshape(olddf, idvar = c("A", "B"), # 固定不变的列 varying = c("C", "D"), # 需要转长格式的列 v.names = "res", # 存储原取值的新列名 timevar = "var", # 存储原列名的新列名 times = c("C", "D"), # 对应原列名的取值 direction = "long") # 去除reshape生成的冗余行名 rownames(newdf) <- NULL
两种方法输出结果完全匹配你给出的newdf示例。
内容的提问来源于stack exchange,提问作者Expectation mean first moment
相关产品推荐
相关产品推荐

