相关疑难解决方法(0)

":="更改另一个data.table

我只是偶然发现了data.table中的一些奇怪的行为.简而言之,使用":="来更改(替换)data.table中列的值似乎也会更改另一个data.table中的值(它是:=操作之前的原始data.table的副本) ).示例代码如下.

我错过了一些关于优秀软件包的基本信息,还是应该有错误报告?

子问题:ifelse()是改变值的最佳方法,如下所示(在一个相当大的表中,~10m行)?它完成了预期的工作,足够快(几秒钟),但是使用详细= TRUE data.table抱怨("项目1的RHS已被复制.无论是NAMED向量还是回收列表RHS.)我无法解密到目前为止的消息:)

library(data.table)
options(datatable.verbose=TRUE)
DT1 <- data.table(f=as.integer(c(1,2,1,1,1,2,1)))
DT2 <- DT1

tables()

DT1
DT2
identical(DT1, DT2) # OK, they should be identical.

# I am not sure ifelse() is the best way to do this, but it does what I want, even though data.table complains
DT1[, f := as.character(ifelse(f==1,"a","b"))]

tables()
DT1
DT2
identical(DT1, DT2) # Not OK -- why did DT2 change?
Run Code Online (Sandbox Code Playgroud)

如果相关,我的系统是:

R version 2.15.3 (2013-03-01) -- "Security Blanket"
Platform: x86_64-w64-mingw32/x64 (64-bit)
data.table 1.8.8
All 943 …
Run Code Online (Sandbox Code Playgroud)

r data.table

5
推荐指数
0
解决办法
136
查看次数

测试两个`data.table`是否指向相同的内存位置

让我们:

DT1 <- data.table(iris)
DT2 <- DT1 # both reference the same memory location though
DT3 <- copy(DT1)
Run Code Online (Sandbox Code Playgroud)

问题:有没有办法检查是否DT2继续引用相同的内存位置DT1

像这样的伪函数:

mem.identical(DT2, DT1) # should return TRUE
mem.identical(DT3, DT1) # should return FALSE
Run Code Online (Sandbox Code Playgroud)

不幸的是,identical或者all.equal不为此目的而工作,因为

identical(DT1,DT3) # gives TRUE
Run Code Online (Sandbox Code Playgroud)

只有在引入一些变化后,才能使用identical以下方法检测差异:

DT1[,Test:=1] # introduces change to DT1 directly, to DT2 indirectly
identical(DT1,DT2) # TRUE - proves that DT2 is linked with DT1
identical(DT1,DT3) # FALSE - DT1 and DT3 are clearly decoupled
Run Code Online (Sandbox Code Playgroud)

r data.table

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

不希望在传递给函数时修改原始 data.table

我是 的粉丝data.table,因为我喜欢为所有当前和未来的需求编写可重用的函数。

这是我在解决这个问题时遇到的一个挑战: Best way to automatically plot all data.table columns using ggplot2

我们将 data.table 传递给一个函数进行绘图,然后原始的 data.table 被修改,即使我们复制了它来防止这种情况发生。

下面是一个简单的代码来说明:

plotYofX <- function(.dt,x,y) {
  dt <- .dt
  dt[, (c(x,y)) := lapply(.SD, function(x) {as.numeric(x)}), .SDcols = c(x,y)]
  ggplot(dt) + geom_step(aes(x=get(names(dt)[x]), y=get(names(dt)[y]))) + labs(x=names(dt)[x], y=names(dt)[y])
}


> dtDiamonds <- data.table(ggplot2::diamonds[2:5,1:3]); 
> dtDiamonds
   carat     cut color
   <num>   <ord> <ord>
1:  0.21 Premium     E
2:  0.23    Good     E
3:  0.29 Premium     I
4:  0.31    Good     J

> plotYofX(dtDiamonds,1,2); 
> dtDiamonds
    carat   cut color …
Run Code Online (Sandbox Code Playgroud)

r ggplot2 data.table

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

修改R中data.table中的值

我是data.table的新手,我遇到了这个类的问题.

我有一个包含2列的表(data1):Couple和Ratio.情侣是data.table的关键.

我正在尝试修改表中的值.

当我写下面的代码时:

(cple is an existing value of Couple) 

data1[cple]$Ratio[1]<-0 #I get more than 50 warnings and it doesn't work

data1$Ratio[1]<-0 # It works perfectly (but it's not the same as the above code)
Run Code Online (Sandbox Code Playgroud)

错误似乎与Keys有关,但我无法弄清楚是什么?

以下是一个例子:

 >data1<-data.table(Couple=c("a","a","b","b"),Ratio=1:4)
 >data1
   Couple Ratio
1:      a     1
2:      a     2
3:      b     3
4:      b     4
>setkey(data1,Couple)

>data1["a"]$Ratio[1]<-2 #doesn't work warning message

WARNING:
#In `[<-.data.table`(`*tmp*`, "a", value = list(Couple = c("a", "a" :
 # Coerced 'double' RHS to 'integer' to match the …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

了解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("mtcars")              # load data
setDT(mtcars)               # convert to data table
mtcars[gear==5, gear :=NA]  # create NA values for the purpose of my application
mtcars2 <- mtcars           # create second DT
Run Code Online (Sandbox Code Playgroud)

我的代码

# Create function
  computeWidth <- function(dataset){
                                    dataset$gear[is.na(dataset$gear)] <- 0 # Convert NA to 0
                                    dataset[ ,width := hp + gear]          # create new variable
                                    }

# Apply function
  lapply(list(mtcars, mtcars2), computeWidth)
Run Code Online (Sandbox Code Playgroud)

如您所见,该函数有效,但它没有修改数据表.你对此有何看法?

r apply lapply data.table

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

具有两个data.tables的类似合并的场景

我有两个数据帧(实际上是data.tables).

set.seed(123)
dt1 <- data.table(P=rep(letters[1:3],c(4,2,3)),X=sample(9))
dt1
   P X
1: a 3
2: a 7
3: a 9
4: a 6
5: b 5
6: b 1
7: c 2
8: c 8
9: c 4
Run Code Online (Sandbox Code Playgroud)

和:

dt2 <- data.table(P=rep(letters[1:5],length=10),D=c("X","Y","Z","G","F"))
dt2
    P D
 1: a X
 2: b Y
 3: c Z
 4: d G
 5: e F
 6: a X
 7: b Y
 8: c Z
 9: d G
10: e F
Run Code Online (Sandbox Code Playgroud)

现在我想向dt1添加一个新列,其中列"D"为dt2,其中P在dt1和dt2中具有相同的值.它应该如下所示:

dt_new
   P X D
1: a 3 …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

R编程:修改时避免复制整个数据帧?

在修改数据框中的一个条目时,R似乎复制整个数据帧.我想知道是否有办法让R只复制相应的数据列(例如下面的特定INTSXP而不是VECSXP)来维护复制变更策略?还有办法对数据帧进行现场修改吗?

> x<-data.frame(x=1:1000000,y=1:1000000)
> .Internal(inspect(x))
@62cd2b0 19 VECSXP g0c2 [OBJ,MARK,NAM(2),ATT] (len=2, tl=0)
  @f80d0e0 13 INTSXP g0c7 [MARK] (len=1000000, tl=0) 1,2,3,4,5,...
  @8ed6970 13 INTSXP g0c7 [] (len=1000000, tl=0) 1,2,3,4,5,...
ATTRIB:
  @68f6b40 02 LISTSXP g0c0 []
    TAG: @4e58868 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "names" (has value)
    @613efd0 16 STRSXP g0c2 [] (len=2, tl=0)
      @4e93038 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "x"
      @4fe8bd8 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "y"
    TAG: @4e62650 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "row.names" (has value)
    @113bb328 13 INTSXP g0c1 [] …
Run Code Online (Sandbox Code Playgroud)

r dataframe

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

将data.table列分配给R中的变量

我在R中分配data.table列有一个问题.我的示例代码如下所示:

library(data.table)
DT <- data.table(A=c(3,5,2,6,4), B=c(6,2,7,2,1), Amount=1:5)
setkey(DT, A)
amt <- DT$Amount 
amt #3 1 5 2 4
setkey(DT, B)
amt #5 2 4 1 3
Run Code Online (Sandbox Code Playgroud)

我使用"$"符号将data.table的列分配给变量"amt",但看起来在我更改了data.table的顺序之后,"amt"的顺序也被更改了.谁能告诉我为什么会这样?我怎样才能避免这种情况的发生(当我改变DT的顺序时,我不希望改变"amt"的顺序)?

非常感谢你.

r variable-assignment data.table

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

为什么R data.table将列添加到我没有引用的另一个数据表中?

我有一个dt1包含列的原始数据表x.我想创建另一个名为dt2contains的数据表x和第一个滞后x.当我执行下面的代码时,我会dt2根据需要获得,但我发现它dt1也变成了dt2- 我不希望这种情况发生.

library(data.table);

x <- rnorm(100, 0, 1);
dt1 <- data.table(x);

dt2 <- dt1;
dt2[, lx:= shift(x, 1, type= "lag")];

identical(dt1, dt2); # evaluates to TRUE
Run Code Online (Sandbox Code Playgroud)

我是否遗漏了有关数据表如何工作的基本信息?任何帮助将不胜感激.

r data.table

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

标签 统计

r ×10

data.table ×9

apply ×1

dataframe ×1

ggplot2 ×1

lapply ×1

variable-assignment ×1