首页 > 解决方案 > 反引号内的 \uxxxx 序列

问题描述

我知道,一般来说,\uxxxx反引号内不支持序列。您是否有任何解决方法将它们(\uxxxx序列)包含在列名中?

具体来说,想象一下计算身体质量指数并将单位添加到列名。

从...开始

dt<-data.frame(
  `Weight [kg]` = runif(5,50,100),
  `Height [m]` = runif(5,1.5,2),
  check.names=F
) 

mutate

> dt2<-dt %>% 
   mutate(
     `BMI [kg/m\u00b2]`= `Weight [kg]`/`Height [m]`^2
)

这会产生一个错误:Error: \uxxxx sequences not supported inside backticks (line 3)

我的解决方法是这样的:

> dt2<-dt %>% 
   mutate(
    `BMI [kg/m2]`= `Weight [kg]`/`Height [m]`^2
  ) %>% 
   set_colnames(colnames(.) %>% str_replace('2\\]', '\u00b2\\]'))

> colnames(dt2)
[1] "Weight [kg]" "Height [m]"  "BMI [kg/m²]"

它给了我我想要的东西,但不是很优雅。

令人惊讶的是,更清晰的方法失败了:

> dt2<-dt %>% 
   mutate(
     `BMI [kg/m2]`= `Weight [kg]`/`Height [m]`^2
   ) %>% 
    rename_all(str_replace, '2\\]', '\u00b2\\]')

> colnames(dt2)
[1] "Weight [kg]" "Height [m]"  "BMI [kg/m2]"

所以,我的问题是:它可以以不那么老套的方式完成吗?

和:

标签: rdplyrtidyverse

解决方案


只使用单引号而不是反引号怎么样?

dt %>% mutate('BMI [kg/m\u00b2]' = `Weight [kg]`/`Height [m]`^2)
#>   Weight [kg] Height [m] BMI [kg/m²]
#> 1    67.68154   1.757490    21.91211
#> 2    72.32362   1.817616    21.89151
#> 3    89.28197   1.854459    25.96146
#> 4    52.14819   1.709520    17.84395
#> 5    83.48281   1.969367    21.52502

还是双引号?

dt %>% mutate("BMI [kg/m\u00b2]" = `Weight [kg]`/`Height [m]`^2)
#>   Weight [kg] Height [m] BMI [kg/m²]
#> 1    67.68154   1.757490    21.91211
#> 2    72.32362   1.817616    21.89151
#> 3    89.28197   1.854459    25.96146
#> 4    52.14819   1.709520    17.84395
#> 5    83.48281   1.969367    21.52502

您还可以使用它们来访问新数据框中的项目:

dt2$'BMI [kg/m\u00b2]'
#> [1] 21.91211 21.89151 25.96146 17.84395 21.52502

dt2$"BMI [kg/m\u00b2]"
#> [1] 21.91211 21.89151 25.96146 17.84395 21.52502

或者您是否出于某种原因特别需要使用反引号?


推荐阅读