考虑以下格式的数据
df<-data.frame("id"=c(1,2,3,4),
"ex"=c(1,0,0,1),
"aQL"=c(5,4,NA,6),
"bQL"=c(5,7,NA,9),
"cQL"=c(5,7,NA,9),
"bST"=c(3,7,8,9),
"cST"=c(8,7,5,3),
"aXY"=c(1,9,4,4),
"cXY"=c(5,3,1,4))
我想保留列(或变量)名称“ id”和“ ex”,并重命名其余列,例如将“ aQL”,“ bQL”和“ cQL”重命名为“ QL.1”,“ QL.2”和“ QL.3“。名称以“ ST”和“ XY”结尾的其他列应以相同的方式重命名,顺序也分别为.1,.2和.3.。值得注意的是,数据集中缺少“ aST”和“ bXY”,但我希望将它们包括在内并重命名为ST.1和XY.2,并分别以NA为条目。预期的输出看起来像
df
id ex QL.1 QL.2 QL.3 ST.1 ST.2 ST.3 XY.1 XY.2 XY.3
1 1 1 5 5 5 NA 3 8 1 NA 5
2 2 0 4 7 7 NA 7 7 9 NA 3
3 3 0 NA NA NA NA 8 5 4 NA 1
4 4 1 6 9 9 NA 9 3 4 NA 4
主数据集有很多变量,因此我希望重命名以自动化的方式进行。我尝试了以下代码
renameCol <- function(x) {
setNames(x, paste0("QL.", seq_len(ncol(x))))
}
renameCol(df)
但它不能按预期工作。因此,它重命名了我要维护的“ id”和“ ex”,并且在重命名多个变量(即QL,ST,XY)时不灵活。任何帮助是极大的赞赏。
我建议一种tidyverse
不需要功能的方法。在此解决方案中,您可以提取每个变量名称的首字母作为id,然后分配一个数字,cur_group_id
以保持顺序。最后,使用这个新数字转换包含名称的变量,然后将其格式化为wide以获取预期的输出:
library(tidyverse)
#Data
df<-data.frame("id"=c(1,2,3,4),
"ex"=c(1,0,0,1),
"aQL"=c(5,4,NA,6),
"bQL"=c(5,7,NA,9),
"cQL"=c(5,7,NA,9),
"bST"=c(3,7,8,9),
"cST"=c(8,7,5,3),
"aXY"=c(1,9,4,4),
"cXY"=c(5,3,1,4))
#Reshape
df %>% pivot_longer(cols = -c(1,2)) %>%
#Extract first letter as id
mutate(id2=substring(name,1,1)) %>%
#Create the number id
group_by(id2) %>%
mutate(id3=cur_group_id()) %>%
#Clean name
mutate(name=substring(name,2,nchar(name))) %>%
#Create final var
mutate(name2=paste0(name,'.',id3)) %>% ungroup() %>%
dplyr::select(-c(name,id2,id3)) %>%
#Format to wide
pivot_wider(names_from = name2,values_from=value)
输出:
# A tibble: 4 x 9
id ex QL.1 QL.2 QL.3 ST.2 ST.3 XY.1 XY.3
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 5 5 5 3 8 1 5
2 2 0 4 7 7 7 7 9 3
3 3 0 NA NA NA 8 5 4 1
4 4 1 6 9 9 9 3 4 4
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句