gpt4 book ai didi

r - dplyr 的 left_join 行为不正确?

转载 作者:行者123 更新时间:2023-12-04 01:51:22 25 4
gpt4 key购买 nike

这肯定不是故意的?这是在 dplyr 的其他地方发生的事情吗?的功能,我应该担心吗?爱表演又恨data.table句法。是否有替代 dplyr 的替代方案?和 data.table目前可以安全使用并且仍然具有高性能?

A <- structure(list(ORDER = c(30305720L, 30334659L, 30379936L, 
30406397L, 30407697L, 30431950L),
COST = c("0", "", "11430.52", "20196.279999999999", "0", "10445.99")),
.Names = c("ORDER", "COST"),
row.names = c(NA, 6L),
class = "data.frame")

B <- structure(list(ORDER = c(30334659, 30379936, 30406397, 30407697, 30431950),
AREA = c(0, 2339, 2162, 23040, 475466)),
.Names = c("ORDER", "AREA"),
row.names = c(4L, 8L, 11L, 12L, 15L),
class = c("tbl_df", "tbl", "data.frame"))

垃圾结果:
left_join(A, B)
ORDER COST AREA
1 30305720 0 NA
2 30334659 NA
3 30379936 11430.52 NA
4 30406397 20196.279999999999 NA
5 30407697 0 NA
6 30431950 10445.99 NA

有效结果:
merge(A, B, all.x=T, all.y=F)
ORDER COST AREA
1 30305720 0 NA
2 30334659 0
3 30379936 11430.52 2339
4 30406397 20196.279999999999 2162
5 30407697 0 23040
6 30431950 10445.99 475466

最佳答案

我前几天发布了类似的东西。我认为您需要做的是将 ORDER 设为数字(或者可能相反)。 A 有 ORDER 有整数。但是 B 有 ORDER 作为数字。目前,dplyr要求您在同一个类中有分组变量。我收到了一位 SO 用户的评论,说这是 Hadley 和他的团队现在一直在做的事情。这个问题将在 future 修复。

A$ORDER <- as.numeric(A$ORDER)
left_join(A,B, by = "ORDER")

ORDER COST AREA
1 30305720 0 NA
2 30334659 0
3 30379936 11430.52 2339
4 30406397 20196.279999999999 2162
5 30407697 0 23040
6 30431950 10445.99 475466

更新
在与 thelatemail 交换意见后,我决定在这里添加更多观察。

案例 1:将 ORDER 视为数字
A$ORDER <- as.numeric(A$ORDER)

> left_join(A,B, by = "ORDER")
ORDER COST AREA
1 30305720 0 NA
2 30334659 0
3 30379936 11430.52 2339
4 30406397 20196.279999999999 2162
5 30407697 0 23040
6 30431950 10445.99 475466

> left_join(B,A, by = "ORDER")
Source: local data frame [5 x 3]

ORDER AREA COST
1 30334659 0
2 30379936 2339 11430.52
3 30406397 2162 20196.279999999999
4 30407697 23040 0
5 30431950 475466 10445.99

如果您在 A 和 B 中都将 ORDER 作为整数,那也可以。

案例 2:将 ORDER 视为整数和数字
> left_join(A,B, by = "ORDER")
ORDER COST AREA
1 30305720 0 NA
2 30334659 NA
3 30379936 11430.52 NA
4 30406397 20196.279999999999 NA
5 30407697 0 NA
6 30431950 10445.99 NA

> left_join(B,A, by = "ORDER")
Source: local data frame [5 x 3]

ORDER AREA COST
1 30334659 0
2 30379936 2339 11430.52
3 30406397 2162 20196.279999999999
4 30407697 23040 0
5 30431950 475466 10445.99

正如 thelatemail 所建议的,整数/数字组合不起作用。但是数字/整数组合有效。

鉴于这些观察结果,目前在分组变量中保持一致是安全的。或者, merge()是要走的路。它可以处理整数和数字。
> merge(A,B, by = "ORDER", all = TRUE)
ORDER COST AREA
1 30305720 0 NA
2 30334659 0
3 30379936 11430.52 2339
4 30406397 20196.279999999999 2162
5 30407697 0 23040
6 30431950 10445.99 475466

> merge(B,A, by = "ORDER", all = TRUE)
ORDER AREA COST
1 30305720 NA 0
2 30334659 0
3 30379936 2339 11430.52
4 30406397 2162 20196.279999999999
5 30407697 23040 0
6 30431950 475466 10445.99

UPDATE2(截至 2014 年 11 月 8 日)

我正在使用 dplyr 的开发版本(dplyr_0.3.0.9000),你可以从 Github 下载。
上面的问题现在已经解决了。
left_join(A,B, by = "ORDER")
# ORDER COST AREA
#1 30305720 0 NA
#2 30334659 0
#3 30379936 11430.52 2339
#4 30406397 20196.279999999999 2162
#5 30407697 0 23040
#6 30431950 10445.99 475466

关于r - dplyr 的 left_join 行为不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25859502/

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