有没有一个优雅的tidyverse方法可以同时重命名列?

kpbwa7wx  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(174)

我正在使用一个小数据集从谷歌表格。列名称是完整的调查问题,如。
“1.哪个团队最能描述您的工作?”
“2、你是经理吗?”
“3.你和x在一起多久了?”
我想将所有这些列重命名为“1”、“2”、“3”等。我知道我可以做下面的操作,但我希望有一个更优雅/更快的方法。共有23列这样的列。

survey %>% rename_with(
  `1` = `1. What team most describes your work?`,
  `2` = `2. Are you a manager?`...

这个很好用,但是编写起来很慢。有人在tidyverse有更好的吗?我是R和编码的新手,所以任何提示都很感谢。

7rfyedvj

7rfyedvj1#

您可以在rename_with(.cols = your_columns)中提供多个列,并使用函数应用于选定列。在这里,问题编号(点之前的数字)被捕获((\\d+)),整个列名被替换为该数字(regex捕获组1 \\1)。
如果省略.cols参数,则默认情况下将选择所有列。

library(dplyr)

# dummy df
df <- tibble("1. What team most describes your work?" = "1",
             "2. Are you a manager?" = "2",
             "3. How long have you been with x?" = "3")

df %>% rename_with(~sub("(\\d+)\\..*$", "\\1", .x))

# A tibble: 1 × 3
  `1`   `2`   `3`  
  <chr> <chr> <chr>
1 1     2     3
f5emj3cl

f5emj3cl2#

还有更简洁的解决方案,其中之一是str_extract

library(stringr)
df %>% rename_with(~str_extract(., "\\d+"))

这里我们提取名称字符串中的第一个数字。
另一种是str_remove

df %>% rename_with(~str_remove(., "\\..*"))

在这里我们去掉这一时期以后的任何东西。
数据(感谢@benson):

df <- tibble("1. What team most describes your work?" = "1",
             "2. Are you a manager?" = "2",
             "3. How long have you been with x?" = "3")

相关问题