我有一个引用数据框 (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
我有另一个数据框 (df2),它只有三个“特征”列。例如:
gender year code
M 2011 A
M 2011 A
F 2018 A
F 2015 B
对于 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), .. .]
)。对于每个匹配项 (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
请注意,Enhanced functionality of mult
argument 上有一个 Unresolved 问题。 ,即当 x
中的多行与 i
中的行匹配时如何处理情况。目前,有效的选项是 "all"
(默认)、"first"
或 "last"
。但是如果/当问题被实现时,mult = "random"
(sample(.N, size = 1L)
) 可以用来选择一个随机行(行)比赛之间。
关于r - 有多个匹配项时加入数据框并选择随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56559559/