我只是偶然发现了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)
如果相关,我的系统是:
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 …
让我们:
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) 我是 的粉丝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) 我是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) 我正在尝试找出我在下面的代码中遇到的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) 我有一些具有相同结构的数据表,我想对它们进行一些数据转换(创建新变量,分配缺失值等)
这是我尝试过的,没有成功.此代码运行正常,但不会更改数据表.有任何想法吗?
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)
如您所见,该函数有效,但它没有修改数据表.你对此有何看法?
我有两个数据帧(实际上是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似乎复制整个数据帧.我想知道是否有办法让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中分配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"的顺序)?
非常感谢你.
我有一个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)
我是否遗漏了有关数据表如何工作的基本信息?任何帮助将不胜感激.