在 R 中添加字符符号时保留数字类型



这是一个示例:

df <- structure(list(Longitud = c(-179.75, -179.75, -179.75, -179.75, 
-179.75, -179.75), Latitud = c(71.25, 68.75, 68.25, 67.75, 67.25, 
66.75), Enero = c(-23, -26, -25.9, -24.1, -24.8, -21), Febrero = c(-25.7, 
-28.7, -27.6, -25, -24.8, -20.1), Marzo = c(-24.3, -26.7, -25.9, 
-23.5, -24, -20.3), Abril = c(-17.9, -20, -19.3, -17.1, -17.4, 
-13), Mayo = c(-7.1, -7.8, -8.6, -7.7, -9.1, -5.8), Junio = c(-0.1, 
0.1, 0, 1.2, -0.4, 2.6), Julio = c(1.8, 3, 2.9, 4.5, 3.4, 6.7
), Agosto = c(1.4, 1.7, 2, 3.8, 3, 6.8), Septimbre = c(-1.7, 
-1.9, -1.8, -0.2, -1.6, 1.4), Octubre = c(-8.2, -10.4, -9.7, 
-7.6, -8.4, -5), Noviembre = c(-15.6, -18.2, -17.5, -15.3, -16, 
-12.4), Diciembre = c(-22.2, -25.5, -24.5, -22.2, -22.4, -18.2
)), .Names = c("Longitud", "Latitud", "Enero", "Febrero", "Marzo", 
"Abril", "Mayo", "Junio", "Julio", "Agosto", "Septimbre", "Octubre", 
"Noviembre", "Diciembre"), row.names = c(NA, 6L), class = "data.frame")

EneroDiciembre的列是数字。我想在这些列中的所有这些值中添加符号摄氏 最后 (º(。但是我想在不将列转换为字符的情况下添加它,以便我可以继续使用数字。

有没有办法打印这个符号并保持数字类型?

units包 (https://r-quantities.github.io/units( 用于打印数字数据,但也通过算术操作传播它们。它不会更改基础数据(例如c(1, 2, 3)( 从数字开始,它只是添加了类属性以使额外的打印/格式化魔术发生。

例如:

library(units)
#> udunits system database from /Library/Frameworks/R.framework/Versions/3.6/Resources/library/units/share/udunits
library(dplyr)
#> ...truncated usual dplyr noises

x <- 1:4
units(x) <- "meters"
x
#> Units: [m]
#> [1] 1 2 3 4
y <- 2:5
units(y) <- "seconds"
y
#> Units: [s]
#> [1] 2 3 4 5
x/y
#> Units: [m/s]
#> [1] 0.5000000 0.6666667 0.7500000 0.8000000
str(x/y)
#> Object of class units:
#>  num [1:4] 0.5 0.667 0.75 0.8
#>  - attr(*, "units")=List of 2
#>   ..$ numerator  : chr "m"
#>   ..$ denominator: chr "s"
#>   ..- attr(*, "class")= chr "symbolic_units"

因此,您可以看到xy保留其数值,并且不强制使用字符。但他们仍然与他们的单位一起打印。您也可以在数据框中执行此操作(原版data.frame和现代整洁tibble(:

# For example, with dummy numbers
# https://en.wikipedia.org/wiki/Heat_transfer_coefficient
data.frame(
T1 = set_units(1:3, "degree_C"),
T2 = set_units(5:7, "degree_C"),
A = set_units(1000:1002, "centimeters^2"),
h = set_units(2:4, "W/(meter^2*degree_c)")
) %>% 
mutate(Q = h*A*(T2-T1))
#>       T1     T2                    A            h          Q
#> 1 1 [°C] 5 [°C] 1000 [centimeters^2] 2 [W/°C/m^2] 0.8000 [W]
#> 2 2 [°C] 6 [°C] 1001 [centimeters^2] 3 [W/°C/m^2] 1.2012 [W]
#> 3 3 [°C] 7 [°C] 1002 [centimeters^2] 4 [W/°C/m^2] 1.6032 [W]
tibble(
T1 = set_units(1:3, "degree_C"),
T2 = set_units(5:7, "degree_C"),
A = set_units(1000:1002, "centimeters^2"),
h = set_units(2:4, "W/(meter^2*degree_c)")
) %>% 
mutate(Q = h*A*(T2-T1))
#> # A tibble: 3 x 5
#>      T1    T2               A          h      Q
#>    [°C]  [°C] [centimeters^2] [W/°C/m^2]    [W]
#> 1     1     5            1000          2 0.8000
#> 2     2     6            1001          3 1.2012
#> 3     3     7            1002          4 1.6032

请注意,两个类之间的打印方法不同。对于data.frame秒,单位在每次输入后打印。对于tibble秒,单位仅打印在每列的顶部。

我们可以像这样使用您的原始数据:

df <-
structure(
list(
Longitud = c(-179.75,-179.75,-179.75,-179.75,-179.75,-179.75),
Latitud = c(71.25, 68.75, 68.25, 67.75, 67.25, 66.75),
Enero = c(-23,-26,-25.9,-24.1,-24.8,-21),
Febrero = c(-25.7,-28.7,-27.6,-25,-24.8,-20.1),
Marzo = c(-24.3,-26.7,-25.9,-23.5,-24,-20.3),
Abril = c(-17.9,-20,-19.3,-17.1,-17.4,-13),
Mayo = c(-7.1,-7.8,-8.6,-7.7,-9.1,-5.8),
Junio = c(-0.1, 0.1, 0, 1.2,-0.4, 2.6),
Julio = c(1.8, 3, 2.9, 4.5, 3.4, 6.7),
Agosto = c(1.4, 1.7, 2, 3.8, 3, 6.8),
Septimbre = c(-1.7,-1.9,-1.8,-0.2,-1.6, 1.4),
Octubre = c(-8.2,-10.4,-9.7,-7.6,-8.4,-5),
Noviembre = c(-15.6,-18.2,-17.5,-15.3,-16,-12.4),
Diciembre = c(-22.2,-25.5,-24.5,-22.2,-22.4,-18.2)
),
.Names = c(
"Longitud", "Latitud",
"Enero", "Febrero", "Marzo",
"Abril", "Mayo", "Junio",
"Julio", "Agosto", "Septimbre",
"Octubre", "Noviembre", "Diciembre"
),
row.names = c(NA, 6L),
class = "data.frame"
)
# class "data.frame"
df %>% 
mutate_at(vars(Enero:Diciembre), ~set_units(., "degree_C"))
#>   Longitud Latitud      Enero    Febrero      Marzo      Abril      Mayo
#> 1  -179.75   71.25 -23.0 [°C] -25.7 [°C] -24.3 [°C] -17.9 [°C] -7.1 [°C]
#> 2  -179.75   68.75 -26.0 [°C] -28.7 [°C] -26.7 [°C] -20.0 [°C] -7.8 [°C]
#> 3  -179.75   68.25 -25.9 [°C] -27.6 [°C] -25.9 [°C] -19.3 [°C] -8.6 [°C]
#> 4  -179.75   67.75 -24.1 [°C] -25.0 [°C] -23.5 [°C] -17.1 [°C] -7.7 [°C]
#> 5  -179.75   67.25 -24.8 [°C] -24.8 [°C] -24.0 [°C] -17.4 [°C] -9.1 [°C]
#> 6  -179.75   66.75 -21.0 [°C] -20.1 [°C] -20.3 [°C] -13.0 [°C] -5.8 [°C]
#>       Junio    Julio   Agosto Septimbre    Octubre  Noviembre  Diciembre
#> 1 -0.1 [°C] 1.8 [°C] 1.4 [°C] -1.7 [°C]  -8.2 [°C] -15.6 [°C] -22.2 [°C]
#> 2  0.1 [°C] 3.0 [°C] 1.7 [°C] -1.9 [°C] -10.4 [°C] -18.2 [°C] -25.5 [°C]
#> 3  0.0 [°C] 2.9 [°C] 2.0 [°C] -1.8 [°C]  -9.7 [°C] -17.5 [°C] -24.5 [°C]
#> 4  1.2 [°C] 4.5 [°C] 3.8 [°C] -0.2 [°C]  -7.6 [°C] -15.3 [°C] -22.2 [°C]
#> 5 -0.4 [°C] 3.4 [°C] 3.0 [°C] -1.6 [°C]  -8.4 [°C] -16.0 [°C] -22.4 [°C]
#> 6  2.6 [°C] 6.7 [°C] 6.8 [°C]  1.4 [°C]  -5.0 [°C] -12.4 [°C] -18.2 [°C]
# classes "tbl_df" "tbl" "data.frame"
df %>% 
as_tibble() %>% 
mutate_at(vars(Enero:Diciembre), ~set_units(., "degree_C"))
#> # A tibble: 6 x 14
#>   Longitud Latitud    Enero  Febrero    Marzo    Abril     Mayo    Junio
#>      <dbl>   <dbl>     [°C]     [°C]     [°C]     [°C]     [°C]     [°C]
#> 1    -180.    71.2    -23.0    -25.7    -24.3    -17.9     -7.1     -0.1
#> 2    -180.    68.8    -26.0    -28.7    -26.7    -20.0     -7.8      0.1
#> 3    -180.    68.2    -25.9    -27.6    -25.9    -19.3     -8.6      0.0
#> 4    -180.    67.8    -24.1    -25.0    -23.5    -17.1     -7.7      1.2
#> 5    -180.    67.2    -24.8    -24.8    -24.0    -17.4     -9.1     -0.4
#> 6    -180.    66.8    -21.0    -20.1    -20.3    -13.0     -5.8      2.6
#> # … with 6 more variables: Julio [°C], Agosto [°C], Septimbre [°C],
#> #   Octubre [°C], Noviembre [°C], Diciembre [°C]

同样,您可以看到两个包之间的打印方法不同。您还可以自定义选项,使其°C而不是[°C]

units_options(sep = c("", ""), group = c("", ""))
data.frame(x = set_units(35:38, "degree_C"))
#>       x
#> 1 35 °C
#> 2 36 °C
#> 3 37 °C
#> 4 38 °C

创建于 2019-11-30 由 reprex 软件包 (v0.3.0(

我们可以使用pastestr_c. 该符号不会被识别为numeric,因此它会将列转换为character

library(dplyr)
library(stringr)
df %>%
mutate_at(vars(Enero:Diciembre), ~ str_c(., "º"))

base R

df[3:ncol(df)] <- lapply(df[3:ncol(df)], paste0, "º")

最新更新