相关疑难解决方法(0)

当变量名存储在字符向量中时,选择/分配给data.table

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)]行不通的(我也没想到).

r data.table

78
推荐指数
3
解决办法
2万
查看次数

通过保存在变量中的名称引用data.table列

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,但不是distval?的最佳方法是什么?

r data.table

41
推荐指数
2
解决办法
2万
查看次数

在列的子集(.SDcols)上应用函数,同时在另一列(在组内)应用不同的函数

这非常类似于将一个共同功能应用于一个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)

r subset lapply data.table

34
推荐指数
2
解决办法
3万
查看次数

如何在循环调用中使用data.table生成变量的线性组合和更新表?

一些玩具数据

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)

我想以这种方式更新DT,并循环通过

i <- 1

New_Var_names <- paste("New_Var_", i, sep …
Run Code Online (Sandbox Code Playgroud)

r data.table

4
推荐指数
1
解决办法
880
查看次数

标签 统计

data.table ×4

r ×4

lapply ×1

subset ×1