小编msp*_*msp的帖子

通过保存在变量中的名称引用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万
查看次数

data.table:为将来的列预分配内存

我们有一个非常大的data.table,我们追加列,主要是data.table.merge.偶尔,这会触发"Cannot allocate vector of size xx Gb"错误,即使我们知道系统上有可用的内存量.

我们怀疑这是因为这个内存不是连续块的一部分,所以我们想在创建data.table时以某种方式预分配更大的RAM.

一个明显的建议是在一开始就创建最终将从另一个列合并到我们的data.table中的所有列.然而,这并不一定要工作,因为merge设计不覆盖的列DT1与那些DT2具有相同的名称,但重命名它们,这样既可以保持.

还有什么可以做的吗?

最小的例子:

x = data.table(a = 1:10, b=2:11)
y = data.table(a = 1:10, c=2:11)

# want this to happen in the most memory-efficient way possible 
# and ideally without allocating new memory at all 
# (i.e., want to be able to pre-allocate enough memory in x 
# in line 1 to be able to do this)
x = merge(x, …
Run Code Online (Sandbox Code Playgroud)

r data.table

5
推荐指数
1
解决办法
925
查看次数

将数据传递给data.table中具有未知数量的以编程方式定义的变量的函数

我们假设我有以下代码:

x = data.table(rowid=1:10, N1=2:11, N2=3:12, N3=4:13)
x[, sum(c(N1, N2, N3)),by=rowid]
Run Code Online (Sandbox Code Playgroud)

现在假设我不知道列名N1,N2,N3,它们被保存在向量中colnames=c("N1", "N2", "N3").如果我知道要传递给的变量数量sum(),我可以colnames按如下方式插入:

x[, sum(c(get(colnames[1]),get(colnames[2]),get(colnames[3]))),by=rowid]
Run Code Online (Sandbox Code Playgroud)

现在假设我不知道它的长度colnames.有什么方法可以重写上面所以它有效吗?类似的东西x[, sum(c(sapply(colnames, as.name))),by=rowid](注意这个确切的表达不起作用).

r data.table

3
推荐指数
1
解决办法
99
查看次数

加速data.table中的行式操作

与数据帧相比,我对tapply使用类似操作的速度有多大提高,我印象非常深刻data.table.

例如:

df = data.frame(class = round(runif(1e6,1,1000)), x=rnorm(1e6))
DT = data.table(df)

# takes ages if somefun is complex
res1 = tapply(df$x, df$class, somefun) 

# takes much faster 
setkey(DT, class)
res2 = DT[,somefun(x),by=class] 
Run Code Online (Sandbox Code Playgroud)

但是,我并没有完全让它的工作速度明显快于apply类似数据帧的操作(即,需要将函数应用于每一行的情况).

df = data.frame(x1 = rnorm(1e6), x2=rnorm(1e6))
DT = data.table(df)

# takes ages if somefun is complex
res1 = apply(df, 1, somefun) 

# not much improvement, if at all 
DT[,rowid:=.I] # or: DT$rowid = 1:nrow(DT)
setkey(DT, rowid)
res2 = DT[,somefun1(x1,x2),by=rowid] 
Run Code Online (Sandbox Code Playgroud)

这真的只是预期还是有一些技巧?

r data.table

2
推荐指数
1
解决办法
1036
查看次数

标签 统计

data.table ×4

r ×4