这是关于data.table连接语法的一个哲学问题.我发现data.tables的用途越来越多,但仍在学习......
X[Y]data.tables 的连接格式非常简洁,方便和高效,但据我所知,它只支持内连接和右外连接.要获得左外部或全外部连接,我需要使用merge:
X[Y, nomatch = NA] - Y中的所有行 - 右外连接(默认)X[Y, nomatch = 0] - 只有在X和Y中都匹配的行 - 内连接merge(X, Y, all = TRUE) - 来自X和Y的所有行 - 完全外部连接merge(X, Y, all.x = TRUE) - X中的所有行 - 左外连接在我看来,如果X[Y]连接格式支持所有4种类型的连接,那将会很方便.有没有理由只支持两种类型的连接?
对我来说,nomatch = 0和nomatch = NA参数值对于正在执行的操作不是非常直观.这是我更容易理解和记忆的merge语法:all = TRUE,all.x = TRUE和all.y = TRUE.由于X[Y]操作类似于merge远远不止match,为什么不使用merge的连接,而不是语法match功能的nomatch参数?
以下是4种连接类型的代码示例:
# …Run Code Online (Sandbox Code Playgroud) 我创建了一个数据库"mydb",当使用lazyLoad("mydb")在工作区中导入(大)data.frames X和Y.我创建了"mydb"将X和Y放在一个环境中e并使用命令tools:::makeLazyLoadDB(e,"mydb")
现在我创建了第三个data.frame Z(相当大).
如何将其添加到"mydb"而不必重新创建X和Y的惰性对象?
如何使用字符向量变量作为参数动态查找多个字段并通过引用添加.在下面的情况下,我想查找两列并删除i.它们中的前缀.当然,他们可以覆盖具有相同名称的现有列.
library(data.table)
set.seed(1)
ID <- data.table(id = 1:3, meta = rep(1,3), key = "id")
JN <- data.table(idd = sample(ID$id, 3, FALSE), value = sample(letters, 3, FALSE), meta = rep(1,3), key = "idd")
select <- c("value","meta") # my fields to lookup
j.lkp <- call(":=", select, lapply(paste0("i.",select), as.symbol))
j.lkp
# `:=`(c("value", "meta"), list(i.value, i.meta))
ID[JN, eval(j.lkp)]
# Error in eval(expr, envir, enclos) : could not find function "i.value"
ID[JN, `:=`(c("value", "meta"), list(i.value, i.meta))]
# id meta value
# …Run Code Online (Sandbox Code Playgroud) 假设我从数据框开始:
ID Measurement1 Measurement2
1 45 104
2 34 87
3 23 99
4 56 67
...
Run Code Online (Sandbox Code Playgroud)
然后我有第二个数据框,用于更新第一个中的记录:
ID Measurement1 Measurement2
2 10 11
4 21 22
Run Code Online (Sandbox Code Playgroud)
我如何使用R结束:
ID Measurement1 Measurement2
1 45 104
2 10 11
3 23 99
4 21 22
...
Run Code Online (Sandbox Code Playgroud)
实际上数据帧是非常大的数据集.
假设我有这样的数据:
set.seed(1)
DT <- data.table(id=rep(1:3,each=3),y=1997L+sample(1:9,9))
DT2<- data.table(id=1:3,y=1997L+sample(1:3,3))
Run Code Online (Sandbox Code Playgroud)
我想在与DT合并后使用DT2 $ y.我看到这个列是y.1在合并后命名的
setkey(DT,id)
names(DT[DT2])
# [1] "id" "y" "y.1"
DT[DT2][,y.1]
# [1] 1998 1998 1998 2000 2000 2000 1999 1999 1999
Run Code Online (Sandbox Code Playgroud)
但是,我不能在j以下名称中使用它:
DT[DT2,y.1]
# Error in `[.data.table`(DT, DT2, y.1) : object 'y.1' not found
Run Code Online (Sandbox Code Playgroud)
我应该在这里使用的秘密前缀或后缀是什么?
我的问题基本上与这个问题相同:data.table join然后将列添加到现有data.frame而不重新复制.
基本上我有一个带键的模板,我想通过相同的键将其他data.tables中的列分配给模板.
> template
id1 id2
1: a 1
2: a 2
3: a 3
4: a 4
5: a 5
6: b 1
7: b 2
8: b 3
9: b 4
10: b 5
> x
id1 id2 value
1: a 2 0.01649728
2: a 3 -0.27918482
3: b 3 0.86933718
> y
id1 id2 value
1: a 4 -1.163439
2: b 4 2.267872
3: b 5 1.083258
> template[x, value := i.value]
> template[y, …Run Code Online (Sandbox Code Playgroud) 我试图在R base中加入两个data.tables,多个setkeys,并且重复输入.举个例子
>DT1
ID state Month Day Year
1 IL Jan 3 2013
1 IL Jan 3 2014
1 IL Jan 3 2014
1 IL Jan 10 2014
1 IL Jan 11 2013
1 IL Jan 30 2013
1 IL Jan 30 2013
1 IL Feb 2 2013
1 IL Feb 2 2014
1 IL Feb 3 2013
1 IL Feb 3 2014
>DT2
state Month Day Year Tavg
IL Jan 1 2013 13
IL Jan 2 2013 19
IL …Run Code Online (Sandbox Code Playgroud) 我有以下两个 data.tables
library(data.table)
dt1 = data.table(index_column = c(12, 17, 29, 34, 46), column1 = c("dog", "cat", "bird", "elephant", "bird"), column2 = c(482, 391, 567, 182, 121))
dt2 = data.table(index_column = c(17, 29, 46), column1 = c("cat", "penguin", "bird"))
> dt1
index_column column1 column2
1: 12 dog 482
2: 17 cat 391
3: 29 bird 567
4: 34 elephant 182
5: 46 bird 121
> dt2
index_column column1
1: 17 cat
2: 29 penguin
3: 46 bird
Run Code Online (Sandbox Code Playgroud)
将这两个 data.table 合并后仅与index_column …
r ×8
data.table ×6
join ×2
database ×1
dataframe ×1
dynamic ×1
lazy-loading ×1
lookup ×1
merge ×1
replace ×1