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()
-不确定这种类型的构造是否包含在数据中。表
渐晕图或引用…@VasilyAc(…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中的一列