如何在R语言中使用pivot_longer转换指定结构的数据框?
使用pivot_longer重塑数据框
首先看你的原始数据框:
df <- data.frame( species = c("species1", "species2", "species3", "species4", "species5", "species6"), Position = c("o", "c", "o", "c", "o", "c"), MeanPd = c(1.2, 2.5, 3.8, 4.1, 2.3, 1.9), sdPd = c(0.5, 0.7, 0.9, 0.6, 0.4, 0.8), MeanMd = c(10.2, 9.5, 11.1, 12.4, 10.9, 11.8), sdMd = c(1.1, 1.3, 1.6, 1.2, 0.9, 1.4) )
要转换成包含species、Position、mean、sd的长格式数据框,可以用tidyr里的pivot_longer,核心是通过正则表达式拆分原列名的前缀(Mean/sd)和后缀(Pd/Md),代码如下:
# 先加载tidyverse包(包含tidyr) library(tidyverse) df_long <- df %>% pivot_longer( # 选中所有以Mean或sd开头的列 cols = starts_with(c("Mean", "sd")), # .value表示将列名的匹配前缀作为新列名;metric用来存储Pd/Md标识(可选) names_to = c(".value", "metric"), # 正则表达式拆分列名:第一组匹配Mean或sd,第二组匹配Pd或Md names_pattern = "(Mean|sd)(Pd|Md)" ) %>% # 将Mean列重命名为mean,sd列重命名为sd,符合需求 rename(mean = Mean, sd = sd) %>% # 如果不需要区分Pd/Md的metric列,就加上这行 select(-metric)
运行后得到的结果:
df_long #> species Position mean sd #> 1 species1 o 1.2 0.5 #> 2 species1 o 10.2 1.1 #> 3 species2 c 2.5 0.7 #> 4 species2 c 9.5 1.3 #> 5 species3 o 3.8 0.9 #> 6 species3 o 11.1 1.6 #> 7 species4 c 4.1 0.6 #> 8 species4 c 12.4 1.2 #> 9 species5 o 2.3 0.4 #> 10 species5 o 10.9 0.9 #> 11 species6 c 1.9 0.8 #> 12 species6 c 11.8 1.4
参数说明
cols:指定需要重塑的列,这里用starts_with()快速筛选目标列,避免逐个列名输入names_to:.value是pivot_longer的特殊参数,用来指定提取列名的一部分作为新的列名;metric则存储列名里的指标类型(Pd/Md),如果不需要可以直接去掉这个参数(但要对应调整names_pattern)names_pattern:用正则分组拆分原列名,第一组(Mean|sd)匹配均值或标准差的前缀,对应到新列;第二组(Pd|Md)匹配指标类型,对应到metric列
内容的提问来源于stack exchange,提问作者user18487205
相关产品推荐
相关产品推荐

