gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:33:29 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com