【发布时间】:2020-06-21 08:24:56
【问题描述】:
我有以下数据表:
> dat1
ID1 ID2 distance
1: 1 1117 3022.22
2: 1 386 16107.74
3: 1 920 17327.00
4: 1 91 24691.42
5: 1 227 29459.34
> dat2
ID1 ID2 common_date_begin common_date_end
1: 2 1 2000-01-01 2006-12-03
2: 3 1 2000-05-01 2006-12-03
3: 3 2 2000-05-01 2006-12-03
4: 1117 1 2000-01-01 2006-12-03
5: 4 2 2000-01-01 2006-12-03
dat1 显示一些气象站 (ID1),它们最近的相邻站 (ID2),以及它们之间的距离。
dat2 显示了每对台站的常用数据可用期。问题是,有些电台在dat1 中是ID1,在dat2 中是ID2。例如,电台1 和1117。
我想将ID1 和ID2 成对加入dat1 和dat2,没有指定顺序。我在做:
dat1[dat2, on=.(ID1, ID2), (cols) := mget(paste0("i.", cols))][,
diff_days := common_date_end - common_date_begin][]
ID1 ID2 distance common_date_begin common_date_end diff_days
1: 1 1117 3022.22 <NA> <NA> NA days
2: 1 386 16107.74 <NA> <NA> NA days
3: 1 920 17327.00 <NA> <NA> NA days
4: 1 91 24691.42 <NA> <NA> NA days
5: 1 227 29459.34 <NA> <NA> NA days
这不起作用,因为 1 和 1117 位于不同的标识符下。
但是,我正在寻找的结果是:
ID1 ID2 distance common_date_begin common_date_end diff_days
1: 1 1117 3022.22 2000-01-01 2006-12-03 2528 days
2: 1 386 16107.74 <NA> <NA> NA days
3: 1 920 17327.00 <NA> <NA> NA days
4: 1 91 24691.42 <NA> <NA> NA days
5: 1 227 29459.34 <NA> <NA> NA days
使用data.table 可以实现这一点吗?
这是重现我的问题的数据:
library(data.table)
dat1 <- read.table(text="ID1 ID2 distance
1 1117 3022.22
1 386 16107.74
1 920 17327.00
1 91 24691.42
1 227 29459.34", header=T, stringsAsFactors=F)
dat1 <- data.table(dat1)
dat2 <- read.table(text="ID1 ID2 common_date_begin common_date_end
2 1 2000-01-01 2006-12-03
3 1 2000-05-01 2006-12-03
3 2 2000-05-01 2006-12-03
1117 1 2000-01-01 2006-12-03
4 2 2000-01-01 2006-12-03", header=T, stringsAsFactors=F)
dat2 <- data.table(dat2)
# convert character to dates
cols <- c("common_date_begin", "common_date_end")
dat2[, (cols) := lapply(.SD, as.Date), .SDcols = cols]
【问题讨论】:
-
我想知道您是否使用了您的解决方案,然后使用相同的命令但使用
.on=.(ID1=ID2, ID2=ID1), ...。
标签: r join data.table