web-dev-qa-db-ja.com

dplyrのleft_joinの動作が正しくありませんか?

確かにこれは意図されていませんか?これはdplyrの機能の他の部分で発生することですか?心配する必要がありますか?私はパフォーマンスが好きで、data.table構文が嫌いです。 dplyrdata.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
12
stanekam

先日、似たようなものを投稿しました。私はあなたがする必要があるのは、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
_
15
jazzurro

dplyrドキュメント から:

left_join()

xからすべての行を返し、xyからすべての列を返します。 xに一致するものがないyの行は、新しい列にNA値を持ちます。 xyの間に複数の一致がある場合、一致のすべての組み合わせが返されます。

semi_join()

xの列だけを残してyに一致する値があるxからすべての行を返します。

半結合は内部結合とは異なります。内部結合はxの一致する行ごとにyの1行を返すため、半結合はxの行を複製しません。 。

semi_join()はあなたにとって価値のあるオプションですか?

1
paoloeusebi