假设我有两个data.table:
A:
A B
1: 1 12
2: 2 13
3: 3 14
4: 4 15
Run Code Online (Sandbox Code Playgroud)
B:
A B
1: 2 13
2: 3 14
Run Code Online (Sandbox Code Playgroud)
我有以下代码:
merge_test = merge(dataA, dataB, by="A", all.data=TRUE)
Run Code Online (Sandbox Code Playgroud)
我明白了:
A B.x B.y
1: 2 13 13
2: 3 14 14
Run Code Online (Sandbox Code Playgroud)
但是,我想在最终合并表中的dataA中的所有行.有没有办法做到这一点?
我有一个相对较大的数据集(1,750,000行,5列),其中包含具有唯一ID值的记录(第一列),由四个条件(其他4列)描述。一个小例子是:
# example
library(data.table)
dt <- data.table(id=c("a1","b3","c7","d5","e3","f4","g2","h1","i9","j6"),
s1=c("a","b","c","l","l","v","v","v",NA,NA),
s2=c("d","d","e","k","k","o","o","o",NA,NA),
s3=c("f","g","f","n","n","s","r","u","w","z"),
s4=c("h","i","j","m","m","t","t","t",NA,NA))
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
id s1 s2 s3 s4
1: a1 a d f h
2: b3 b d g i
3: c7 c e f j
4: d5 l k n m
5: e3 l k n m
6: f4 v o s t
7: g2 v o r t
8: h1 v o u t
9: i9 <NA> <NA> w <NA>
10: j6 <NA> <NA> z <NA>
Run Code Online (Sandbox Code Playgroud)
我的最终目标是在任何描述列上查找所有具有相同字符的记录(不考虑NA),并将它们分组为新的ID,以便我可以轻松识别重复的记录。这些ID是通过串联每行的ID来构造的。 …
说我有一个数据表:
dt <- data.table(
datetime = seq(as.POSIXct("2016-01-01 00:00:00"),as.POSIXct("2016-01-01 10:00:00"), by = "1 hour"),
ObType = c("A","A","B","B","B","B","A","A","B","A","A")
)
dt
datetime ObType
1: 2016-01-01 00:00:00 A
2: 2016-01-01 01:00:00 A
3: 2016-01-01 02:00:00 B
4: 2016-01-01 03:00:00 B
5: 2016-01-01 04:00:00 B
6: 2016-01-01 05:00:00 B
7: 2016-01-01 06:00:00 A
8: 2016-01-01 07:00:00 A
9: 2016-01-01 08:00:00 B
10: 2016-01-01 09:00:00 A
11: 2016-01-01 10:00:00 A
Run Code Online (Sandbox Code Playgroud)
我需要做的是在ObType为"B"的任何地方,我需要找到两边最近的ObType"A"的时间.所以结果应该是(几个小时):
datetime ObType timeLag timeLead
1: 2016-01-01 00:00:00 A NA NA
2: 2016-01-01 01:00:00 A NA …Run Code Online (Sandbox Code Playgroud) 我想知道为什么 data.table 的左连接没有给我多个匹配项,似乎有一些奇怪的内置“无重复”,这并不能真正使其成为左连接,不是吗?
数据:
test=data.table(mtcars[1,])
test2=data.table(mtcars[c(1,1),])
Run Code Online (Sandbox Code Playgroud)
数据表:
test[test2, on = c(carb = "carb"), wt2 := i.wt]
Run Code Online (Sandbox Code Playgroud)
dplyr:
test %>% left_join(test2 %>% select(carb, wt) %>% rename(wt2 = wt),
by = "carb")
Run Code Online (Sandbox Code Playgroud)
dplyr 给了我正确的两行结果,但 data.table 只给了我一行。这里发生了什么?
我目前正在使用 R 来处理如下所示的数据集:
age ep
1 0
2 0
3 1
4 1
5 1
6 1
7 0
8 0
9 1
10 1
11 0
Run Code Online (Sandbox Code Playgroud)
我想创建一个变量来跟踪每个 ep=1 系列中第一次出现的 ep=1。这些系列的第一个 ep=1 之前的 ep=0 和每个系列的最后一个 ep=1 之后的 ep=0。
我希望数据集在处理后看起来像这样:
age ep first
1 0 NA
2 0 NA
3 1 1
4 1 NA
5 1 NA
6 1 NA
7 0 NA
8 0 NA
9 1 1
10 1 NA
11 0 NA
Run Code Online (Sandbox Code Playgroud)
我在数据表中工作,因为这个数据集相当大,所以我更喜欢使用数据表的代码处理数据,但是如果这不可能,我可以转换为数据框并使用其他代码。任何帮助将不胜感激。
有如下结构的两个数据表:
DT1 <- data.table(ID=c("A","B","C"), P0=c(1,10,100), key="ID")
DT2 <- data.table(ID=c("B","B","B","A","A","A","C","C","C"), t=rep(seq(0:2),3), P=c(NA,30,50,NA,4,6,NA,200,700))
Run Code Online (Sandbox Code Playgroud)
在数据表中DT2,列中的所有 NAP应由P0数据表中的值更新DT1。
如果DT2按IDlike排序DT1,问题可以这样解决:
setorder(DT2,ID)
idxr <- which(DT2[["t"]]==1)
set(DT2, i=idxr, j="P", value=DT1[["P0"]])
Run Code Online (Sandbox Code Playgroud)
但是数据表如何在没有事先排序的情况下“合并”DT2呢?
data.table ×6
r ×6
merge ×2
dplyr ×1
grepl ×1
left-join ×1
loops ×1
na ×1
optimization ×1
time ×1