相关疑难解决方法(0)

在函数中通过引用向data.table添加新列并不总是有效

在写一个依赖的包时data.table,我发现了一些奇怪的行为.我有一个函数删除和重新排序一些列引用,它工作得很好,这意味着data.table我传入的是修改而不分配函数输出.我有另一个添加列的函数,但这些更改并不总是存在于data.table传入的列中.

这是一个小例子:

library(data.table)  # I'm using 1.9.4
test <- data.table(id = letters[1:2], val=1:2)
foobar <- function(dt, col) {
    dt[, (col) := 1]
    invisible(dt)
}

test
#  id val
#1: a   1
#2: b   2
saveRDS(test, "test.rds")
test2 <- readRDS("test.rds")
all.equal(test, test2)
#[1] TRUE
foobar(test, "new")
test
#  id val new
#1: a   1   1
#2: b   2   1
foobar(test2, "new")
test2
#  id val
#1: a   1
#2: b   2
Run Code Online (Sandbox Code Playgroud)

发生了什么?有什么不同test2 …

r data.table

16
推荐指数
1
解决办法
1349
查看次数

R data.table 奇怪的值/引用语义

(这是一个跟进问题这个。)

检查这个玩具代码:

> x <- data.frame(a = 1:2)
> foo <- function(z) { setDT(z) ; z[, b:=3:4] ; z } 
> y <- foo(x)
> 
> class(x)
[1] "data.table" "data.frame"
> x
   a
1: 1
2: 2
Run Code Online (Sandbox Code Playgroud)

看起来 setDT 确实改变了 x 的类,但是添加的数据不适用于 x。
这里发生了什么?

r data.table

15
推荐指数
1
解决办法
338
查看次数

将环境中的所有 data.frames 转换为 data.tables

:=在将所有 data.frames 转换为 data.tables 后立即使用时收到警告:

library(data.table) #Win R-3.5.1 x64 data.table_1.12.2
df1 <- data.frame(A=1, B=2)
df2 <- data.frame(D=3)
lapply(mget(ls()), function(x) {
    if (is.data.frame(x)) {
        setDT(x)
    }
})
df1[, rn:=.I]
Run Code Online (Sandbox Code Playgroud)

警告消息: In [.data.table(df1, , :=(rn, .I)) : Invalid .internal.selfref 通过获取 data.table 的(浅)副本检测和修复,以便 := 可以通过引用添加此新列。早些时候,这个 data.table 已被 R 复制(或使用 structure() 或类似方法手动创建)。避免 names<- 和 attr<- 目前在 R 中(而且很奇怪)可能会复制整个 data.table。使用 set* 语法来避免复制:?set、?setnames 和 ?setattr。如果此消息没有帮助,请将您的用例报告给 data.table 问题跟踪器,以便修复根本原因或改进此消息。

下面也生成相同的警告:

df3 <- data.frame(E=3)
df4 <- data.frame(FF=4)
for (l in list(df3, df4)) setDT(l)
df3[, rn:=.I] …
Run Code Online (Sandbox Code Playgroud)

r data.table

6
推荐指数
2
解决办法
469
查看次数

了解data.table无效的.selfref警告

我正在尝试找出我在下面的代码中遇到的data.table'invalid .selfref'错误。

library(data.table) 
library(dplyr)
DT <- data.table(aa=1:100, bb=rnorm(n=100), dd=gl(2,100))
DT <- DT %.% group_by(dd, aa) %.% summarize(m=mean(bb))
DT <- DT[, ee := 3]
Run Code Online (Sandbox Code Playgroud)

最后一行引发错误。这里有一个建议,就是将最后一行写为,DT$ee <- 3但并不能真正解释它为什么起作用(和:=不能起作用),并且作为一个初学者data.table用户也不觉得自己是正确的data.table习惯用法。

它与那里的dplyr线有关,显然改变了DT数据表。但是,当我将该行(及其后面的行)更改为该行时,DDT <- DT %.% group_by() ...仍然会从该DT[, ee := 3]行收到selfref错误。

一直在检查各种来源,但那里的所有信息并没有真正减少,因此我仍然感到困惑。

R version 3.1.0 (2014-04-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=Dutch_Netherlands.1252  LC_CTYPE=Dutch_Netherlands.1252   
[3] LC_MONETARY=Dutch_Netherlands.1252 LC_NUMERIC=C                      
[5] LC_TIME=Dutch_Netherlands.1252    

attached base packages:
[1] graphics  grDevices utils     datasets  stats     methods   base     

other attached packages:
[1] dplyr_0.2        data.table_1.9.2 ggplot2_1.0.0   

loaded via …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

标签 统计

data.table ×4

r ×4