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功能?
非常感谢任何帮助。
使用 '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)) 可用于在匹配项中选择随机行(行)。