将.SD与重命名的变量相结合,会使.SD列的名称混乱。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将.SD与重命名的变量相结合,会使.SD列的名称混乱。相关的知识,希望对你有一定的参考价值。
在我的代码中,我想以编程的方式选择一些变量,并以硬编码的方式选择和重命名其他一些变量。我知道我可以通过两步来实现这个目标,即使用 setnames()
但我很好奇如何一步到位。
我想我已经很接近了,通过 .SDcols
. 然而,当我尝试将 .SD
与重新命名的列,".SDcols
列 "的前缀是".SD."。如何避免这个前缀?
library(data.table)
dt <- as.data.table(mtcars)[1:5]
dt
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> 1: 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#> 2: 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#> 3: 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
#> 4: 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#> 5: 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
my_vars <- c("cyl", "vs")
# with .SDcol
dt[, .(.SD, z = gear), .SDcol = my_vars]
#> .SD.cyl .SD.vs z # Note the prefix that had been added to the .SDcols
#> 1: 6 0 4
#> 2: 6 0 4
#> 3: 4 1 4
#> 4: 6 1 3
#> 5: 8 0 3
# with named vector
all_vars <- c(my_vars, z = "gear")
dt[, ..all_vars]
#> cyl vs gear
#> 1: 6 0 4
#> 2: 6 0 4
#> 3: 4 1 4
#> 4: 6 1 3
#> 5: 8 0 3
答案
我想这是因为你把 .SD
在 list
(.()
). 该 list(.SD)
产生一个 list
含有 .SD
data.table
而不是 只是 的 .SD
. 这样就会搞乱命名。
检查 str
的 .SD
裹挟 list
:
# dt[, str(.(.SD)), .SDcol = my_vars]
# List of 1
# $ :Classes ‘data.table’ and 'data.frame': 5 obs. of 2 variables:
# ..$ cyl: num [1:5] 6 6 4 6 8
# ..$ vs : num [1:5] 0 0 1 1 0
相应的产出有: .SD.
前缀。
dt[ , .(.SD), .SDcol = my_vars]
# .SD.cyl .SD.vs
# 1: 6 0
# 2: 6 0
# 3: 4 1
# 4: 6 1
# 5: 8 0
检查 str
的 .SD
只是。
# dt[, str(.SD), .SDcol = my_vars]
# Classes ‘data.table’ and 'data.frame': 5 obs. of 2 variables:
# $ cyl: num 6 6 4 6 8
# $ vs : num 0 0 1 1 0
给予基本属性: j
- "只要 j
返回一个列表,列表中的每个元素都会成为结果中的一列。data.table
"--而这 .SD
已是 list
(检查 dt[ , is.list(.SD)]
),我们可以用 c
结合 .SD
与其他列表元素一起使用,例如,您的重命名列被包裹在了 list
:
dt[, c(.SD, .(z = gear)), .SDcol = my_vars]
# cyl vs z
# 1: 6 0 4
# 2: 6 0 4
# 3: 4 1 4
# 4: 6 1 3
# 5: 8 0 3
以上是关于将.SD与重命名的变量相结合,会使.SD列的名称混乱。的主要内容,如果未能解决你的问题,请参考以下文章
将 scale_shape_manual 制作的图例与命名向量相结合