2017-12-20 13 views
9

私はオーバーラッピング間隔を見つけようとしていて、dplyr::left_join()でインターバルデータに参加することにしました。その結果、lubridate::int_overlaps()のインターバルと同じIDで他のインターバルを比較することができました。間隔を置いて2つのデータフレームを結合するのは正しくありませんか?

left_join()の動作は次のとおりです。 3行 9を持つ行を形成するように交差して2 tibbles:

library(tidyverse) 

tibble(a = rep("a", 3), b = rep(1, 3)) %>% 
    left_join(tibble(a = rep("a", 3), c = rep(2, 3))) 
Joining, by = "a" 
# A tibble: 9 x 3 
     a  b  c 
    <chr> <dbl> <dbl> 
1  a  1  2 
2  a  1  2 
3  a  1  2 
4  a  1  2 
5  a  1  2 
6  a  1  2 
7  a  1  2 
8  a  1  2 
9  a  1  2 

そしてここでは、同じコードが間隔でどのように動作するかです。私は9行になりますが、上記のように行が交差しません:

tibble(a = rep("a", 3), b = rep(make_date(2001) %--% make_date(2002), 3)) %>% 
    left_join(tibble(a = rep("a", 3), c = rep(make_date(2002) %--% make_date(2003)))) 
Joining, by = "a" 
# A tibble: 9 x 3 
     a        b        c 
    <chr>     <S4: Interval>     <S4: Interval> 
1  a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
2  a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
3  a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
4  a       NA--NA       NA--NA 
5  a       NA--NA       NA--NA 
6  a       NA--NA       NA--NA 
7  a       NA--NA       NA--NA 
8  a       NA--NA       NA--NA 
9  a       NA--NA       NA--NA 

これは予期しないと思いますが、何か不足している可能性があります。それともバグですか?

私は 1.7.1, 1.3.4および 0.7.4を使用しています。しかし

> AA <- tibble(a = rep("a", 3), b = rep(make_date(2001) %--% make_date(2002), 3)) 
> class(AA$b) 
[1] "Interval" 
attr(,"package") 
[1] "lubridate" 
> AA 
Error in round_x - lhs : 
    Arithmetic operators undefined for 'Interval' and 'Interval' classes: 
    convert one to numeric or a matching time-span class. 

+0

を報告しました。 – pasipasi

答えて

4

tibble()のバグのように見えます

> AA <- as.data.frame(AA) 
class(AA$b) 
> class(AA$b) 
[1] "Interval" 
attr(,"package") 
[1] "lubridate" 
> AA 
    a        b 
1 a 2001-01-01 UTC--2002-01-01 UTC 
2 a 2001-01-01 UTC--2002-01-01 UTC 
3 a 2001-01-01 UTC--2002-01-01 UTC 

したがって、この作品:

> AA <- tibble(a = rep("a", 3), b = rep(make_date(2001) %--% make_date(2002), 3)) 
> BB <- tibble(a = rep("a", 3), c = rep(make_date(2002) %--% make_date(2003))) 
> AA %>% as.data.frame %>% left_join(BB) 
Joining, by = "a" 
    a        b        c 
1 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
2 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
3 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
4 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
5 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
6 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
7 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
8 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
9 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 

を、これはありませんが:

> AA %>% left_join(BB) 
Joining, by = "a" 
Error in round_x - lhs : 
    Arithmetic operators undefined for 'Interval' and 'Interval' classes: 
    convert one to numeric or a matching time-span class. 

注:私は、x86_64版-pc-linux-gnuのよう

+1

興味深い。ありがとう。 OPと同じパッケージバージョンでは、Rバージョン3.3.3になります.OPと同じ出力、つまりエラーメッセージは表示されません。あなたの仕事に感謝します。 –

7

バグ

オブジェクトのためのR 3.4.3に、tibble_1.4.1(lubridateとあなたとdplyrの同じバージョン)を使用していますまだ関連の情報が含まれています

res <- tibble(a = rep("a", 3), b = rep(make_date(2001) %--% make_date(2002), 3)) %>% 
    left_join(tibble(a = rep("a", 3), c = rep(make_date(2002) %--% make_date(2003)))) 

print.data.frame(res) 
# a        b        c 
# 1 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# 2 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# 3 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# 4 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# 5 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# 6 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# 7 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# 8 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# 9 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 

res$c  
# [1] 2002-01-01 UTC--2003-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# [5] 2002-01-01 UTC--2003-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# [9] 2002-01-01 UTC--2003-01-01 UTC 

しかし、指標によってサブセットが、それは動作しませんanywmore:

res_df <- as.data.frame(res) 

head(res_df) 
    a        b        c 
1 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
2 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
3 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
4 a       NA--NA       NA--NA 
5 a       NA--NA       NA--NA 
6 a       NA--NA       NA--NA 

res_df[4,"c"] 
[1] NA--NA 

およびtibble:::print.tblheadを使用します。そのため、問題はすぐにtibblesで表示され、data.framesでは表示されません。

str(res$b)と入力すると、9 dataの値が3つしかありません。

私たちがしなければ:

[email protected] <- rep([email protected],3) 
[email protected] <- rep([email protected],3) 

eveythingを今も元気印刷:

a        b        c 
1 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
2 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
3 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
4 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
5 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
6 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
7 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
8 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
9 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 

ソリューション

我々はas.data.frameが十分ではないことを見てきた、left_joinは、関数メッシングですものごとは、代わりにmergeを使用してください:

res <- tibble(a = rep("a", 3), b = rep(make_date(2001) %--% make_date(2002), 3)) %>% 
    merge(tibble(a = rep("a", 3), c = rep(make_date(2002) %--% make_date(2003))), 
     all.x=TRUE) 

head(res) 
# a        b        c 
# 1 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# 2 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# 3 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# 4 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# 5 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 
# 6 a 2001-01-01 UTC--2002-01-01 UTC 2002-01-01 UTC--2003-01-01 UTC 

res[4,"c"] 
#[1] 2002-01-01 UTC--2003-01-01 UTC 

私が入社する前の間隔に開始日と終了日を変換しないことにより、これを回避できる問題here

+5

'dplyr'の非ベース型のサポートを強化するために、この[メタ問題](https://github.com/tidyverse/dplyr/issues/2432)があります。 vctrsの[この問題](https://github.com/hadley/vctrs/issues/27)。 – pasipasi

+0

ありがとうございます。ここでは、 'start'スロットのために、lubridate間隔を扱うときにも' dplyr :: filter'に問題があるようです。 –

関連する問題