data.table如果变量名存储在字符向量中,如何引用变量?例如,这适用于data.frame:
df <- data.frame(col1 = 1:3)
colname <- "col1"
df[colname] <- 4:6
df
# col1
# 1 4
# 2 5
# 3 6
Run Code Online (Sandbox Code Playgroud)
如何使用或不使用:=表示法对data.table执行相同的操作?显而易见的事情是dt[ , list(colname)]行不通的(我也没想到).
data.table是一个梦幻般的R包,我在我正在开发的库中使用它.到目前为止,一切都很顺利,除了一个并发症.data.table使用保存在变量中的名称来引用列(例如:对于数据帧),似乎要比使用常规数据帧更难(与传统数据帧相比colname="col"; df[df[,colname]<5,colname]=0).
也许最让事情变得复杂的是这种语法明显缺乏一致性data.table.在某些情况下,eval(colname)和get(colname),甚至c(colname)似乎工作.在其他方面,DT[,colname, with=F]是解决方案.然而在其他方面,例如,set()和subset()功能,我根本没有找到解决方案.最后,前面讨论了一个极端的,虽然也是非常常见的用例(以编程方式将列名称传递给data.table),并且建议的解决方案虽然显然正在完成他们的工作,但似乎并不特别可读......
也许我太复杂了?如果有人可以记下快速备忘单,以便data.table使用不同常见场景的变量来引用列名,我将非常感激.
更新:
提供的一些具体示例我可以硬编码列名:
x.short = subset(x, abs(dist)<=100)
set(x, which(x$val<10), "val", 0)
Run Code Online (Sandbox Code Playgroud)
现在假设distcol="dist",valcol="val".使用distcoland valcol,但不是dist和val?的最佳方法是什么?
这非常类似于将一个共同功能应用于一个data.table完整.SDcols 答案的多个列的问题.
不同之处在于我想同时在不属于.SD子集的另一列上应用不同的函数.我在下面发布一个简单的例子来展示我尝试解决问题:
dt = data.table(grp = sample(letters[1:3],100, replace = TRUE),
v1 = rnorm(100),
v2 = rnorm(100),
v3 = rnorm(100))
sd.cols = c("v2", "v3")
dt.out = dt[, list(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]
Run Code Online (Sandbox Code Playgroud)
产生以下错误:
Error in `[.data.table`(dt, , list(v1 = sum(v1), lapply(.SD, mean)), by = grp,
: object 'v1' not found
Run Code Online (Sandbox Code Playgroud)
现在这是有道理的,因为v1列不包含在必须首先计算的列子集中.所以我通过将其包含在我的列子集中进一步探索:
sd.cols = c("v1","v2", "v3")
dt.out = dt[, list(sum(v1), lapply(.SD,mean)), by = grp, .SDcols = …Run Code Online (Sandbox Code Playgroud) set.seed(123)
df <- data.frame(what_ever = rnorm(5, 50, 1),
this_is = rnorm(5, 30, 1),
wtf_nnn = rnorm(5, 20, 1),
hat_ever = rnorm(5, 50, 1),
who_is = rnorm(5, 30, 1),
mmm_nnn = rnorm(5, 20, 1)
)
library(data.table)
DT <- data.table(df)
str(DT)
Classes ‘data.table’ and 'data.frame': 5 obs. of 6 variables:
Run Code Online (Sandbox Code Playgroud)
如何data.table
使用循环生成以下结果的新变量?
New_Var_1 = what_ever/hat_ever
New_Var_2 = this_is/who_is
New_Var_3 = wtf_nnn/mmm_nnn
Run Code Online (Sandbox Code Playgroud)
nm <- names(df)
nm1 <- nm[1:3]
nm2 <- nm[4:6]
Run Code Online (Sandbox Code Playgroud)
i <- 1
New_Var_names <- paste("New_Var_", i, sep …Run Code Online (Sandbox Code Playgroud)