R 在j中同时使用列名向量和硬编码列

R 在j中同时使用列名向量和硬编码列,r,data.table,R,Data.table,(我永远记不清j在数据表中是如何计算的, 每次我需要调用j中的变量定义列时,我都必须使用()、c()、get()、with=FALSE和进行一些尝试和错误操作。) 对于下面的示例,我没有找到正确的组合 我需要选择一些列,并添加一个从其他列计算的列,如下所示: require(data.table) data("mtcars") setDT(mtcars) mtcars[,.(mpg, cyl,disp, newcol=carb*3)] # mpg cyl d

(我永远记不清
j
数据表中是如何计算的,
每次我需要调用
j
中的变量定义列时,我都必须使用
()
c()
get()
with=FALSE
进行一些尝试和错误操作。

对于下面的示例,我没有找到正确的组合

我需要选择一些列,并添加一个从其他列计算的列,如下所示:

require(data.table)
data("mtcars")
setDT(mtcars)

mtcars[,.(mpg,   cyl,disp,  newcol=carb*3)]
#     mpg cyl  disp newcol
# 1: 21.0   6 160.0     12
# 2: 21.0   6 160.0     12
# 3: 22.8   4 108.0      3
# 4: 21.4   6 258.0      3
# 5: 18.7   8 360.0      6
但是,我的问题是某些列名存储在字符向量中:

mycols <- c('cyl', 'disp')
mycol3 <- 'carb'
到目前为止,我找到了一个解决办法,但它真的很难看:

mtcars[ , c('mpg',   mycols,  mycol3), with=F
        ][ , ('newcol') := get(mycol3)*3
           ][ , c('mpg',mycols,'newcol'), with=F]

正确的方法是什么?

数据中执行此操作的一种方法。表

  • 添加新列

  • 选择所需的所有列


  • 数据表中执行此操作的一种方法是:

  • 添加新列

  • 选择所需的所有列


  • 我们可以使用
    .SDcols

    library(data.table)
    mtcars[,  newcol := .SD[[1]] *3,.SDcols = mycol3]    
    

    我们可以使用
    .SDcols

    library(data.table)
    mtcars[,  newcol := .SD[[1]] *3,.SDcols = mycol3]    
    

    您正在查找
    列表
    。这不会修改对象

     mtcars[,c(mget(mycols), .(newcol = get(mycol3)*3))]
        cyl  disp newcol
     1:   6 160.0     12
     2:   6 160.0     12
     3:   4 108.0      3
     4:   6 258.0      3
     5:   8 360.0      6
     6:   6 225.0      3
     7:   8 360.0     12
     8:   4 146.7      6
     9:   4 140.8      6
    
    编辑: 如前所述,我们还需要
    mpg
    变量:

    mtcars[,c(mget(mycols), .(newcol = get(mycol3)*3, mpg = mpg))]
        cyl  disp newcol  mpg
     1:   6 160.0     12 21.0
     2:   6 160.0     12 21.0
     3:   4 108.0      3 22.8
     4:   6 258.0      3 21.4
     5:   8 360.0      6 18.7
    
    甚至

    mtcars[,c(mget(mycols), .(newcol = get(mycol3)*3), .(mpg = mpg))]
        cyl  disp newcol  mpg
     1:   6 160.0     12 21.0
     2:   6 160.0     12 21.0
     3:   4 108.0      3 22.8
     4:   6 258.0      3 21.4
     5:   8 360.0      6 18.7
     6:   6 225.0      3 18.1
    

    也就是说,只需将命名变量
    mpg
    或任何其他变量添加到列表中。

    您正在寻找一个
    列表。这不会修改对象

     mtcars[,c(mget(mycols), .(newcol = get(mycol3)*3))]
        cyl  disp newcol
     1:   6 160.0     12
     2:   6 160.0     12
     3:   4 108.0      3
     4:   6 258.0      3
     5:   8 360.0      6
     6:   6 225.0      3
     7:   8 360.0     12
     8:   4 146.7      6
     9:   4 140.8      6
    
    编辑: 如前所述,我们还需要
    mpg
    变量:

    mtcars[,c(mget(mycols), .(newcol = get(mycol3)*3, mpg = mpg))]
        cyl  disp newcol  mpg
     1:   6 160.0     12 21.0
     2:   6 160.0     12 21.0
     3:   4 108.0      3 22.8
     4:   6 258.0      3 21.4
     5:   8 360.0      6 18.7
    
    甚至

    mtcars[,c(mget(mycols), .(newcol = get(mycol3)*3), .(mpg = mpg))]
        cyl  disp newcol  mpg
     1:   6 160.0     12 21.0
     2:   6 160.0     12 21.0
     3:   4 108.0      3 22.8
     4:   6 258.0      3 21.4
     5:   8 360.0      6 18.7
     6:   6 225.0      3 18.1
    

    也就是说,只需将命名变量
    mpg
    或任何其他变量添加到列表中。

    hmmm所以真的没有办法在一次
    []
    调用中获得它吗?(当然不是批评,只是好奇是否有可能)同样,在这个解决方案中,有一个不需要的
    carb
    列,我必须以某种方式删除它…@VasilyA检查更新的答案以获得相同的精确输出。我还加了一条备用的单行线。谢谢!我唯一不喜欢的一点是,原来的表被修改了。到目前为止,我已经求助于显式复制一个对象:
    copy(df)[,newcol:=get(mycol3)*3][,…cols]
    。您知道有没有其他方法可以防止修改原始表?嗯,所以真的没有办法在一次
    []
    调用中使用它?(当然不是批评,只是好奇是否有可能)同样,在这个解决方案中,有一个不需要的
    carb
    列,我必须以某种方式删除它…@VasilyA检查更新的答案以获得相同的精确输出。我还加了一条备用的单行线。谢谢!我唯一不喜欢的一点是,原来的表被修改了。到目前为止,我已经求助于显式复制一个对象:
    copy(df)[,newcol:=get(mycol3)*3][,…cols]
    。你知道有没有其他方法可以防止修改原来的表格?谢谢你,阿克伦,我没有考虑这个方向!理想情况下,我不想修改原来的表格。谢谢你,阿克伦,我没有考虑这个方向!理想情况下,我宁愿不修改原始表。酷!我不知道
    j
    可以在
    c()
    中包含
    list()
    -不确定这种类型的构造是否包含在
    数据中。表
    渐晕图或引用…@VasilyA
    c(…list(…))
    是基本的R构造
    j
    需要是一个列表,您可以
    c
    将两个列表合并在一起,仍然可以获得另一个列表。回想一下,这不是一个列表列表,而是一个包含更多元素的列表。例如,尝试
    c(列表(1,2),3)
    c(1,2,列表(3))
    ,或
    c(列表(1,2),列表(3))
    ,看看会发生什么。它们都应该是一样的。那我做了什么?我用第二个事实来生产我想要的。。如果这回答了问题,请接受答案以关闭question@VasilyA参见
    ?data.table
    中的示例,在这里您可以找到
    c(列表(某物),
    构造:
    DT[,c((y=max(y)),lappy(.SD,min))
    。这是一个相当常见的用例,其中
    lappy的结果(.SD
    是一个列表,您可以使用
    c
    将另一个列表元素
    (y=max(y))
    。然后
    j
    的基本属性开始生效:“只要
    j
    返回一个列表,列表中的每个元素都将成为结果
    数据表中的一列。表
    ”。Cherssome什么相关阅读:(“以编程方式选择一些变量,并以硬编码方式选择和重命名其他一些变量”)@Onyanbu和Vasily:为了完整性和未来的访问者,可能还包括
    j
    中的
    mpg
    ,这是原始问题的一部分:将编程选择的变量和硬编码的变量(mpg)结合起来.cheers scool!我不知道
    j
    可以在
    c()
    中包含
    list()
    -不确定这种类型的构造是否包含在
    数据中
    是一个基本的R结构。
    j
    需要是一个列表,你可以将两个列表合并在一起,仍然可以获得另一个列表。回想一下,这不是一个列表列表列表,而是一个包含更多元素的列表。例如尝试
    c(列表(1,2),3)
    c(1,2,列表(3))
    ,或
    c(列表(1,2),列表(3))
    然后看看会发生什么。所有这些都应该是一样的。那么我做了什么?我用第二个事实产生了我想要的。如果这回答了问题,请接受答案以关闭question@VasilyA参见
    ?data.table
    中的示例,您可以在其中找到
    c(列表(某物),
    构造:
    DT[,c((y=max(y)),lappy(.SD,min))
    。这是一个非常常见的用例,其中
    lappy(.SD
    的结果是一个列表,
    c
    将另一个列表元素
    (y=max(y))
    。然后,
    j
    的基本属性开始:只要
    j
    返回一个列表,列表中的每个元素就成为t中的一列