加入数据框并在有多个匹配时选择随机行

rw2*_*rw2 3 join r dplyr data.table

我有一个参考数据框 (df1),其中包含三列“特征”(性别、年份、代码)和两列“值”(数量、状态)。它看起来像这样,但有很多行:

gender    year    code    amount   status
     M    2011       A        15      EMX
     M    2011       A       123      NOX
     F    2015       B         0      MIX
     F    2018       A        12      NOX
     F    2015       B        11      NOX
Run Code Online (Sandbox Code Playgroud)

我有另一个数据框(df2),它只有三个“特征”列。例如:

gender    year   code
     M    2011      A
     M    2011      A
     F    2018      A
     F    2015      B
Run Code Online (Sandbox Code Playgroud)

对于 df2 中的每一行,我想根据“特性”中的匹配将“值”分配给 df1。如果有多个匹配项,我想随机选择成对的“值”。因此,当 df2 中存在重复的“特征”时,它们最终可能会得到不同的“值”对,但它们在 df1 中都将完全匹配。本质上,对于每个特征组合,我希望值的分布在两个表之间匹配。

例如,“df2”中的最后一行(性别 = F,年份 = 2015,代码 = B)匹配“df1”中的两行:第三行(amont = 0,状态 = MIX)和第五行(金额 = 11,状态 = NOX)。然后应该随机选择这些匹配行之一。对于所有此类基于性别、年份和代码在 'df2' 和 'df1' 之间进行多次匹配的情况,应随机选择一行。


到目前为止,我的方法是首先使用在两个数据帧之间dplyr做一个left_join。但是,这为 df2 中的每一行提供了所有可能的“值”,而不是随机选择一个。所以我必须按特征分组并选择一个。这会产生一个非常大的中间表并且看起来效率不高。

我想知道是否有人对更有效的方法有建议?我以前发现加入data.table包更快,但对包并没有很好的理解。我还想知道我是否应该进行连接,还是应该只使用该sample功能?

非常感谢任何帮助。

Hen*_*rik 5

使用 'd2' 根据 'gender'、'year'、'code' ( d1[d2, on = .(gender, year, code), ...]) 中的匹配查找 'd1' 中的行。对于每个匹配项 ( by = .EACHI),采样一行 ( sample(.N, 1L))。使用它来索引“数量”和“状态”。

d1[d2, on = .(gender, year, code),
  {ri <- sample(.N, 1L)
  .(amount = amount[ri], status = status[ri])}, by = .EACHI]

# sample based on set.seed(1)
#    gender year code amount status
# 1:      M 2011    A     15    EMX
# 2:      M 2011    A     15    EMX
# 3:      F 2018    A     12    NOX
# 4:      F 2015    B     11    NOX
Run Code Online (Sandbox Code Playgroud)

请注意,参数的增强功能mult存在一个未解决的问题,即如何处理多行 inx与 in行匹配的情况i。当前,有效选项为"all"(默认)"first""last"。但是如果/当问题被实施时,mult = "random"( sample(.N, size = 1L)) 可用于在匹配项中选择随机行(行)。