2017-12-20 113 views
9

मैं ओवरलैपिंग अंतराल ढूंढने की कोशिश कर रहा हूं और dplyr::left_join() के साथ अंतराल डेटा में शामिल होने का निर्णय लिया ताकि मैं lubridate::int_overlaps() के साथ अंतराल की तुलना उसी आईडी द्वारा हर दूसरे अंतराल के साथ कर सकूं।अंतराल के साथ दो डेटा फ्रेम में शामिल होना misbehaves?

यहां मैं व्यवहार करने के लिए left_join() की अपेक्षा करता हूं। तीन पंक्तियों के साथ दो tibbles एक 9 के साथ पंक्तियों के रूप में पार:

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 

और यहाँ कैसे एक ही कोड अंतराल के साथ बर्ताव करता है। मैं नौ पंक्तियां प्राप्त लेकिन पंक्तियों पार नहीं करते जैसे वे ऊपर कार्य करें:

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 का उपयोग कर रहा हूं।

+0

मैं इस के आसपास नहीं शामिल होने से पहले अंतराल के लिए आरंभ और समाप्ति तिथि परिवर्तित करके प्राप्त कर सकते हैं रिपोर्ट की है। – pasipasi

उत्तर

4

tibble() में एक बग की तरह लग रहा:

> 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. 
हालांकि

:

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

नोट: मैं tibble_1.4.1 (lubridate और आप के रूप dplyr के समान संस्करण) का उपयोग कर रहा x86_64-पीसी-linux-gnu

+1

दिलचस्प। धन्यवाद। ओपी के समान पैकेज संस्करणों के साथ, आप आर संस्करण 3.3.3 पर, मुझे ओपी के समान आउटपुट मिलता है, यानी कोई त्रुटि संदेश नहीं। आपके काम के लिए धन्यवाद। –

7

बग

वस्तु के लिए आर 3.4.3 पर, अभी भी प्रासंगिक जानकारी होती है:

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 

लेकिन जब सूचकांक द्वारा subsetting यह काम नहीं करता 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) हम देखते हैं कि हमारे पास केवल 0 मानों के लिए मूल्य हैं।

अगर हम करते हैं:

[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) है। और [इस मुद्दे] (https://github.com/hadley/vctrs/issues/27) vctrs में। – pasipasi

+0

धन्यवाद। यहां प्रासंगिक यह है कि ऐसा लगता है कि 'dplyr :: filter' के साथ-साथ lubridate अंतराल से निपटने के दौरान भी समस्या हो सकती है, फिर भी' स्टार्ट 'स्लॉट के कारण। –

संबंधित मुद्दे