確かにこれは意図されていませんか?これは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と彼のチームが現在取り組んでいるものであるというコメントを受け取りました。この問題は、将来修正される予定です。
_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
_
[〜#〜] update [〜#〜] 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で提案されているように、整数/数値の組み合わせは機能しません。ただし、数値と整数の組み合わせは機能します。
これらの観察結果を考慮すると、現時点ではgroup-by変数で一貫性を保つことが安全です。または、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
_
PDATE2(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
_
dplyrドキュメント から:
left_join()
x
からすべての行を返し、x
とy
からすべての列を返します。x
に一致するものがないy
の行は、新しい列にNA
値を持ちます。x
とy
の間に複数の一致がある場合、一致のすべての組み合わせが返されます。
semi_join()
x
の列だけを残してy
に一致する値があるx
からすべての行を返します。半結合は内部結合とは異なります。内部結合は
x
の一致する行ごとにy
の1行を返すため、半結合はx
の行を複製しません。 。
semi_join()
はあなたにとって価値のあるオプションですか?