如何使用R在宽数据中自动重命名列

理查德

考虑以下格式的数据

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章