2017-07-06 108 views
0

比方說,我有許多學科和許多測試變量數據幀:R中合併行,同時排除某些數據

Name  Date1  Date2 `Test1` `Test2` `Test3` 
    <dbl>  <dttm>  <dttm> <chr> <chr> <chr> 
1 Steve 2012-02-27 2011-11-18 <NA> <NA>  3 
2 Steve 2012-02-27 2012-01-22  4  <NA> <NA> 
3 Steve 2012-02-27 2014-08-09 <NA>  8  <NA> 
4 Mike 2012-02-09 2007-03-29  1  2  3 
5 Mike 2012-02-09 2009-07-13 <NA>  5  6 
6 Mike 2012-02-09 2014-03-11 <NA> <NA>  9 
7 John 2012-03-20 2013-10-22  1  2  <NA> 
8 John 2012-03-20 2014-03-17  4  5  <NA> 
9 John 2012-03-20 2015-06-01 <NA>  8  9 

我想知道(最有可能與dplyr)如何排除行的數據具有過去Date1的Date2。然後通過(按名稱排列)將剩餘數據組合成一行,同時排除具有較新結果的較早數據。然後編寫一個排除Date2列的新數據框,但仍包含數據中的「NA」。
此外,如果沒有Date2列在Date1列之前,我想保留名稱但包含一行「NA」(如「John」的情況)。

所以結果應該是這樣的:

Name  Date1 `Test1` `Test2` `Test3` 
    <dbl>  <dttm> <chr> <chr> <chr> 
1 Steve 2012-02-27  4  <NA>  3 
2 Mike 2012-02-09  1  5  6 
3 John 2012-03-20 <NA> <NA> <NA> 

任何幫助,在此將不勝感激,謝謝。

+1

完美,安德魯·古斯塔夫,該訣竅。我無法感謝你的幫助。 – Sam

回答

1

這將dplyr做...

library(dplyr) 
df2 <- df %>% filter(as.Date(Date2) <= as.Date(Date1)) %>% #remove date2 past date1 
    arrange(as.Date(Date2)) %>% #make sure ordered by date2 
    group_by(Name, Date1) %>% #group by name and date1 
    summarise_all(function(x) last(x[!is.na(x)])) %>% #summarise remaining (i.e. the test-columns) by the last non-NA value 
    right_join(df %>% distinct(Name, Date1)) %>% #join names and date1 from original df (to restore NA rows such as John) 
    select(-Date2) #remove Date2 

df2 

    Name  Date1 Test1 Test2 Test3 
1 Steve 2012-02-27  4 <NA>  3 
2 Mike 2012-02-09  1  5  6 
3 John 2012-03-20 <NA> <NA> <NA>