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

标签 r join 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

我有另一个数据框 (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/

相关文章:

MySQL加入: Conditions in WHERE or in ON (2)

python - 什么不是 python ?特殊功能类型?

regex - 在 stringr 中拆分一个大写跟随小写的字符串

mysql - 优化Mysql索引多表JOIN

mysql - 尝试通过 SQL JOIN 将 "add"一列添加到表中

r - 根据条件更新多行

R:循环自定义 dplyr 函数

r - 循环遍历列并按组计算 IQR,然后根据引用组计算每个组的比例 IQR 的最快方法?

javascript - R 从 javascript 操作获取 html 数据

r - 以交互方式处理占用大量内存的列表对象