【问题标题】:R - join data tables by pairs of keysR - 通过键对连接数据表
【发布时间】: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。例如,电台11117

我想将ID1ID2 成对加入dat1dat2,没有指定顺序。我在做:

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

这不起作用,因为 11117 位于不同的标识符下。 但是,我正在寻找的结果是:

  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


【解决方案1】:

您可以在加入之前先对列进行排序:

dat1[, paste0("ID", 1L:2L) := .(pmin(ID1, ID2), pmax(ID1, ID2))]
dat2[, paste0("ID", 1L:2L) := .(pmin(ID1, ID2), pmax(ID1, ID2))]

【讨论】:

  • pminpmax 是做什么的?
  • @YOLO,它是minmax 的并行版本。所以例如pmin(5:1, 1:5)c(1,2,3,2,1)。更多详情见?pmin
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多