我的问题如下: 我需要分析来自多个不同文件的数据,其中包含大量条目(每列最多 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), ]
您可以使用
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 )]