这个问题是关于理解,我要投资我的学习精力用于数据R.之间扯皮具体dplyr,dtplyr和data.table。我dplyr主要使用数据,但是当数据太大而无法使用时data.tabe,这种情况很少发生。因此,现在dtplyrv1.0已成为的接口data.table,从表面上看,我似乎再也不需要担心data.table再次使用该接口。
那么,目前尚不能使用的最有用的功能或方面data.table是什么dtplyr,而将来可能永远无法使用dtplyr?
从表面上看,dplyr借助的好处,data.table它听起来像dtplyr会超越dplyr。会不会有任何理由来使用dplyr,一旦dtplyr已经完全成熟?
注意:我不是在问dplyrvs data.table(就像在data.table vs dplyr中:一个人可以做得很好而另一个不能做得不好或做得不好吗?),但是鉴于在一个特定问题上一个人比另一个人更受青睐,为什么呢?牛逼dtplyr是使用工具。
也许有些人可以告诉我为什么我为"dataVars"分配的名字在我的data.table中添加一列后没有改变(没有重新分配它们)?如何保持赋值只存储前两个列名?
谢谢!
编辑:在我看来,这不是这个问题的重复,因为我特别要求一个包含data.table列名的向量,而不是data.table本身.当然机制是相同的,但似乎指出这个机制有什么扩展效果似乎对这个网站上的其他用户有用 - 因此我不会删除这个问题.
library(data.table)
DT <- data.table(a=1:10, b=1:10)
idVars <- names(DT)
print(idVars)
# [1] "a" "b"
DT[, "c" := 1:10]
print(idVars)
# [1] "a" "b" "c"
# devtools::session_info()
# data.table * 1.11.6 2018-09-19 CRAN (R 3.5.1)
Run Code Online (Sandbox Code Playgroud) 检查这个玩具代码:
> x <- data.table(a = 1:2)
> foo <- function(z) { z[, b:=3:4] }
> y <- foo(x)
> x[]
a b
1: 1 3
2: 2 4
Run Code Online (Sandbox Code Playgroud)
看来 data.table 是通过引用传递的。这是故意的吗?这有记录吗?我确实阅读了文档,但找不到提及此行为。
我并不是在询问 R 的文档化参考语义(在:=以及set***其他一些文档中)。我问 data.table 完整对象是否应该作为函数参数通过引用传递。
编辑:根据@Oliver 的回答,这里有一些更奇怪的例子。
> dt<- data.table(a=1:2)
> attr(dt, ".internal.selfref")
<pointer: 0x564776a93e88>
> address(dt)
[1] "0x5647bc0f6c50"
>
> ff<-function(x) { x[, b:=3:4]; print(address(x)); print(attr(dt, ".internal.selfref")) }
> ff(dt)
[1] "0x5647bc0f6c50"
<pointer: 0x564776a93e88>
Run Code Online (Sandbox Code Playgroud)
因此,不仅.internal.selfref与调用者的 dt 副本相同,而且地址也相同。这确实是同一个物体。(我认为)。 …
我有一个数据表,结构如下:
structure(list(GVKEY1 = c(2721, 113609, 62634, NA, 62599, 15855,
15855, NA, NA, NA), GVKEY2 = c(NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_
), GVKEY3 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), GVKEY4 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_), GVKEY5 = c(NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_
)), .Names = c("GVKEY1", "GVKEY2", "GVKEY3", "GVKEY4", "GVKEY5"
), class = c("data.table", "data.frame"), row.names = c(NA, -10L
)) …Run Code Online (Sandbox Code Playgroud) 对于示例数据框:
survey <- structure(list(id = 1:10, cntry = structure(c(2L, 3L, 1L, 2L,
2L, 3L, 1L, 1L, 3L, 2L), .Label = c("DE", "FR", "UK"), class = "factor"),
age.cat = structure(c(1L, 1L, 2L, 4L, 1L, 3L, 4L, 4L, 1L,
2L), .Label = c("Y_15.24", "Y_40.54", "Y_55.plus", "Y_less.15"
), class = "factor")), .Names = c("id", "cntry", "age.cat"
), class = "data.frame", row.names = c(NA, -10L))
Run Code Online (Sandbox Code Playgroud)
我想添加一个名为'age.cat'的额外列,该列由另一个数据帧填充:
age.cat <- structure(list(cntry = structure(c(2L, 3L, 1L), .Label = c("DE",
"FR", "UK"), class = "factor"), Y_less.15 = c(0.2, …Run Code Online (Sandbox Code Playgroud) library(tidyverse)
library(data.table)
dt <- data.table(x=1:3)
dt[x==1]
myfun <- function(d) d[x==1,x:=NA]
dt2 <- dt %>% myfun
dt[x==1]
Run Code Online (Sandbox Code Playgroud)
在这个例子中,dt(一个data.table)作为参数通过管道发送给一个函数(myfun)。然后将结果保存到对象 dt2 中。
为什么 dt 被修改?(如您所见,第 1 行中 x 的值从 1 变为 NA)