将.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
答案

我想这是因为你把 .SDlist (.()). 该 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列的名称混乱。的主要内容,如果未能解决你的问题,请参考以下文章

linux怎么读取SD卡CID?

重命名 SD 卡中的文件夹

SD 一轮集训 day1 carcar

将 scale_shape_manual 制作的图例与命名向量相结合

SD-WAN篇(7.0) ❀ 06. 如何选择合适的DNS?

飞鱼相册笔记----外置SD卡文件夹名称不区分大小写