Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R merge.data.frame:不明确键的概率结果_R_Merge_Duplicates - Fatal编程技术网

R merge.data.frame:不明确键的概率结果

R merge.data.frame:不明确键的概率结果,r,merge,duplicates,R,Merge,Duplicates,数据和上下文优先:所讨论的数据是 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)) 及 现在,在做什么 merge(df1, df2, by.x = c("A", "B"), by.y = c

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

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))

现在,在做什么

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

合并的结果是什么

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

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

虽然这个简单的解决方案有效,但效率会降低(特别是在内存使用方面)。导致相同结果的内存效率更高的解决方案是:

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))

谢谢你的解决方案,投了赞成票。由于我(还?)不熟悉
data.table
,我更喜欢
base
解决方案。我会让它开着,以防有人插话。如果没有,我会在一段时间后接受它。@phaebz添加了一个基本的R解决方案谢谢!我认为这是我应该更仔细地调查
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))
df12 <- merge(df1, df2, by.x = c("A", "B"), by.y = c("A", "C"))

aggregate( . ~ A + B + D.x, df12, sample, 1)
# 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