gpt4 book ai didi

r - 将 .SD 与重命名的变量与 .SD 列的名称相结合

转载 作者:行者123 更新时间:2023-12-04 12:19:32 32 4
gpt4 key购买 nike

在我的代码中,我想以编程方式选择一些变量,并以硬编码方式选择和重命名其他一些变量。我知道我可以通过 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 ,而不仅仅是 .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

关于r - 将 .SD 与重命名的变量与 .SD 列的名称相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62281389/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com