【发布时间】:2012-01-12 13:46:09
【问题描述】:
我有一个 data.table DT,其中有一个名为 RF 的列和许多带有下划线 _ 的列。我想用一个循环遍历所有这些列
下划线并从中减去RF 列。但是,我被困住了。似乎 RHS 上的所有内容
data.table 中的 := 运算符不适用于动态变量。
这是我的DT 和所需的输出(硬编码):
library(data.table)
DT <- data.table(RF = 1:10,
S_1 = 11:20,
S_2 = 21:30)
#Desired output
DT[ , S_1 := S_1 - RF]
DT[ , S_2 := S_2 - RF]
DT
RF S_1 S_2
[1,] 1 10 20
[2,] 2 10 20
[3,] 3 10 20
...
但是,我希望它更灵活,即遍历名称中带有“_”的每一列并减去 RF:
#1. try: Does not work; Interestingly, the i on the LHS of := is interpreted as the column i, but on the RHS of
#:= it is interpreted as 2 and 3, respectively
for (i in grep("_", names(DT))){
DT[ , i:= i - 1, with=FALSE]
}
DT
RF S_1 S_2
[1,] 1 1 2
[2,] 2 1 2
[3,] 3 1 2
...
#2. try: Work with parse and eval
for (i in grep("_", names(DT), value=TRUE)){
DT[ , eval(parse(text=i)):= eval(parse(text=i)) - RF]
}
#Error in eval(expr, envir, enclos) : object 'S_1' not found
任何提示如何做到这一点都会很棒。
编辑:我一发布这个问题,我就想:你为什么首先使用:= 运算符,果然,我刚刚意识到我不必这样做。这确实有效,不需要循环:
DT[, grep("_", names(DT)), with=FALSE] - DT[, RF]
对此感到抱歉。但是,我没有回答这个问题,因为我仍然对为什么我使用 := 运算符的方法不起作用感兴趣。所以也许有人可以帮助我。
【问题讨论】:
-
另外一个用于自行查找基本答案——并让我们知道。 :-)
-
两个想法:1)我会将此作为答案发布并接受它,以及 2)使用
grep()而不是grepl()有什么好处/坏处? -
@Chase 好的,我会这样做的。但是,我无法让示例与 grepl 一起使用,无论是
with=FALSE还是没有它。感谢你们俩的帮助!编辑:我会在两天内接受答案,显然我不能更早。 -
-
+1 表示有趣的问题和可重复的示例,尤其是在找到解决方案后将其搁置。
标签: r data.table