使用 dplyr 来改变以数字作为名称的列

问题描述 投票:0回答:1

在数据框中,我有两列(名称是数字,因为表格是更宽的数据透视的结果)。我希望能够使用这些列来使用 mutate,但它无法使其工作。 这是数据。

df <- structure(list(Age_Band = c("20-30", "20-30", "30-40", "30-40", 
                                  "40-50", "40-50", "50-60", "50-60"), Gender = c("female", "male", 
                                                                                  "female", "male", "female", "male", "female", "male"), `2012` = c(20881.9, 
                                                                                                                                                    19962.1, 29710.85, 26187.4, 50536.05, 21359.3, 26447.65, 24520.95
                                                                                  ), `2013` = c(20132.4, 17268.15, 22622.1, 21543.05, 39569.15, 
                                                                                                15701.1, 21450.95, 21020.6)), class = c("tbl_df", "tbl", "data.frame"
                                                                                                ), row.names = c(NA, -8L))

这是我试图运行的代码。创建一个具有差异的新列。

df %>%
  mutate(difference = 2013 - 2012)

我假设它不起作用,因为列名是数字?还有其他方法吗?否则有没有办法在 dplyr 中重命名它们,因为我也找不到办法做到这一点。非常感谢任何帮助。谢谢。

r
1个回答
0
投票

我建议重命名它们,例如使用

rename_with
(或者,如果可以的话,首先避免创建它们)

library(dplyr)

df %>% 
  rename_with(~ if_else(grepl("^\\d+$", .x), paste0("var", .x), .x))
# A tibble: 8 × 4
  Age_Band Gender var2012 var2013
  <chr>    <chr>    <dbl>   <dbl>
1 20-30    female  20882.  20132.
2 20-30    male    19962.  17268.
3 30-40    female  29711.  22622.
4 30-40    male    26187.  21543.
5 40-50    female  50536.  39569.
6 40-50    male    21359.  15701.
7 50-60    female  26448.  21451.
8 50-60    male    24521.  21021.

如果您必须使用数字,请通过使用

将它们视为符号来访问它们
  • 反引号`2012`
  • eval(as.name("2012"))
  • !!sym("2012")
© www.soinside.com 2019 - 2024. All rights reserved.