gpt4 book ai didi

R合并.data.frame : probabilistic result for ambiguous keys

转载 作者:行者123 更新时间:2023-12-03 21:03:12 26 4
gpt4 key购买 nike

数据和上下文优先:所讨论的数据是

set.seed(123)
df1 <- data.frame(A = rep(1, 4), B = c(2, 6, 4, 4), D = c(0.1, 0.2, 0.3, 0.4))
df2 <- data.frame(A = rep(1, 4), C = c(2, 4, 6, 4), D = c(0.5, 0.6, 0.7, 0.8))

所以我们有

> df1
A B D
1 1 2 0.1
2 1 6 0.2
3 1 4 0.3
4 1 4 0.4

> df2
A C D
1 1 2 0.5
2 1 4 0.6
3 1 6 0.7
4 1 4 0.8

现在,做的时候

merge(df1, df2, by.x = c("A", "B"), by.y = c("A", "C"))

一个人得到

  A B D.x D.y
1 1 2 0.1 0.5
2 1 4 0.3 0.6
3 1 4 0.3 0.8
4 1 4 0.4 0.6
5 1 4 0.4 0.8
6 1 6 0.2 0.7

因为 (A,B) 和 (A,C) 值的组合不明确。

实际问题:如何通过将 D.x 和 D.y 随机分配给 (A,B) 来解决这个问题,例如得到同样的可能性

  A B D.x D.y
1 1 2 0.1 0.5
2 1 4 0.3 0.6
5 1 4 0.4 0.8
6 1 6 0.2 0.7

  A B D.x D.y
1 1 2 0.1 0.5
3 1 4 0.3 0.8
4 1 4 0.4 0.6
6 1 6 0.2 0.7

作为合并的结果?

最佳答案

使用 data.table 包,您可以按如下方式进行:

library(data.table)
DT <- dt1[dt2, on = c(A="A", B="C")][, .(i.D = sample(i.D,1)), by = .(A, B, D)]

这给出了两种可能的结果(多次运行上面的代码以查看不同的结果):

> DT
A B D i.D
1: 1 2 0.1 0.5
2: 1 4 0.3 0.6
3: 1 4 0.4 0.8
4: 1 6 0.2 0.7

或:

> DT
A B D i.D
1: 1 2 0.1 0.5
2: 1 4 0.3 0.8
3: 1 4 0.4 0.6
4: 1 6 0.2 0.7

虽然这个简单的解决方案可行,但效率较低(尤其是在内存使用方面)。导致相同结果的内存效率更高的解决方案是:

dt1[, indx := 1:.N, keyby = .(A, B)]
dt2[, indx := if(.N > 1L) sample(.N) else 1L, keyby = .(A, C)]
dt1[dt2, on = c(A = "A", B = "C", indx = "indx")]

通过在两个数据集中创建索引并为第二个数据集对该索引进行采样,您可以加入它。这防止了笛卡尔连接,在这种情况下,所有可能的组合首先都包含在连接中。


使用的数据:

dt1 <- data.table(A = rep(1, 4), B = c(2, 6, 4, 4), D = c(0.1, 0.2, 0.3, 0.4))
dt2 <- data.table(A = rep(1, 4), C = c(2, 4, 6, 4), D = c(0.5, 0.6, 0.7, 0.8))

在基础 R 中你可以这样做:

df12 <- merge(df1, df2, by.x = c("A", "B"), by.y = c("A", "C"))

aggregate( . ~ A + B + D.x, df12, sample, 1)

aggregate 函数的三个连续运行中给出了以下三个结果:

# run 1
A B D.x D.y
1 1 2 0.1 0.5
2 1 6 0.2 0.7
3 1 4 0.3 0.6
4 1 4 0.4 0.8

# run 2
A B D.x D.y
1 1 2 0.1 0.5
2 1 6 0.2 0.7
3 1 4 0.3 0.8
4 1 4 0.4 0.8

# run 3
A B D.x D.y
1 1 2 0.1 0.5
2 1 6 0.2 0.7
3 1 4 0.3 0.8
4 1 4 0.4 0.6

关于R合并.data.frame : probabilistic result for ambiguous keys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33997158/

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