如何在R中使用pivot_longer一步实现三维数组转data.frame?
用pivot_longer一步将array转成目标data.frame?
手里有个R语言的array对象foo,要转成指定格式的data.framebar。现在已经有个两步的办法:先用pivot_longer拉长数据,再用separate_wider_delim拆分列名。想问能不能只用pivot_longer的names_sep参数一步搞定?
现有数据和目标结果
# 我现有的array foo <- array(1:24, dim = c(4,3,2)) dimnames(foo) <- list(NULL, paste0("varName",1:3), paste0("Iteration",1:2)) foo # 我想要的data.frame bar <- data.frame(value=1:24, varName = rep(c("y1","y2","y3"), each=4), Iteration = c(rep("z1", times=12), rep("z2", times=12))) bar
现有的两步解决方案
bar2 <- as.data.frame(foo) %>% pivot_longer(everything()) %>% separate_wider_delim(cols=name, delim=".", names=c("varName","Iteration")) bar2
一步到位的实现
当然可以!直接用pivot_longer的names_sep参数拆分列名,再顺便把取值改成目标格式就行:
library(tidyr) bar_one_step <- as.data.frame(foo) %>% pivot_longer( cols = everything(), names_to = c("varName", "Iteration"), # 拆分后生成的列名 names_sep = "\\.", # 按列名里的点号拆分(正则里点号要转义) values_to = "value" ) %>% # 把varName1改成y1,Iteration1改成z1 mutate( varName = sub("varName", "y", varName), Iteration = sub("Iteration", "z", Iteration) ) bar_one_step
这么做的逻辑:
names_to指定拆分后要生成的两个列名names_sep用转义后的点号作为拆分规则,直接把原列名(比如varName1.Iteration1)拆成两部分- 最后用
sub替换掉前缀,就能完全匹配目标bar的格式
内容的提问来源于stack exchange,提问作者user111024
相关产品推荐
相关产品推荐

