合并两个data.table,同时过滤唯一ID:只有 NA 作为答案

问题描述 投票:0回答:1

我的问题如下: 我需要分析来自多个不同文件的数据,其中包含大量条目(每列最多 500.000 个,总共 10 列)。 这些文件通过使用 ID 连接,例如ORDER_ID。 但是,ID 可以出现多次,例如当订单包含多个订单行时。也有可能某个 ID 没有出现在其中一个文件中,例如因为包含销售数据的文件仅包含已发货订单的信息,而不包含尚未发货的订单信息。

因此,我有不同的文件,具有不同的长度和唯一的 ID,用于标识所有数据文件中外观(存在或不存在)可能不同的位置。 我现在想要的是按 ID 过滤一个文件,以便它只显示另一个文件中列出的 ID。此外,第一个文件中的附加列应移过去。

我所拥有的示例: dt1:

ORDER_ID        SKU_ID          Quantity_Shipped
12345            678910           100
12346            648392            30
64739            648392            20

dt2:

ORDER_ID        Country
12345              DE
12346              DE
55430              SE
90632              JPN
76543              ARG
64739              CH

我想要什么:

ORDER_ID        SKU_ID          Quantity_Shipped     Country
12345            678910           100                 DE
12346            648392            30                 DE
64739            648392            20                 CH

最初,数据是从 csv 文件导入的。 到目前为止,我使用的方法在合并两个文件时是有效的。 然而,当尝试添加第三个文件中的信息时,我只得到 NA 作为答案。我可以做什么来解决这个问题?

这是我迄今为止使用的方法。

df2 <- data.frame(ORDER_ID = sales[["ORDER_ID"]])
df1 <- data.frame(ORDER_ID = OL[["ORDER_ID"]], SKU_ID = OL[["SKU_ID"]], 
QTY_SHIPPED = OL[["QTY_SHIPPED"]], EXPECTED_VOLUME = 
              OL[["EXPECTED_VOLUME"]])
library(data.table)
dt2 <- data.table(df1)
dt1 <- data.table(df2)

dt3 <- dt2[match(dt1$ORDER_ID, dt2$ORDER_ID), ]
r merge na uniqueidentifier
1个回答
2
投票

您可以使用

data.table
中固有的“合并”,或显式
merge
命令(这也调用
data.table
S3 方法,但这在这里并不完全重要)。

dt2[dt1, on = "ORDER_ID"]
#    ORDER_ID Country SKU_ID Quantity_Shipped
# 1:    12345      DE 678910              100
# 2:    12346      DE 648392               30
# 3:    64739      CH 648392               20

merge(dt1, dt2, by = "ORDER_ID")

有时我更喜欢清晰的

merge
调用,因为我可以控制左/右和其他方面(如果上面默认的首次使用不能满足我的要求)。我发现 https://rstudio-pubs-static.s3.amazonaws.com/52230_5ae0d25125b544caab32f75f0360e775.html 对于左/右和其他连接类型有很好的参考。

merge
无法充分发挥作用时,如果您正在进行范围连接,无论是使用
data.table::foverlaps
或固有方法的扩展:

# with mythical data, joining on `dat1$val` within `dat2$val` and `dat2$val2`
dat1[dat2, on = .( val >= val1 & val <= val2 )]
© www.soinside.com 2019 - 2024. All rights reserved.