2017-07-06 5 views
0

Lassen Sie uns sagen, dass ich einen Datenrahmen mit vielen Themen haben und viele Testvariablen:Merging Reihen in R, während bestimmte Daten ohne

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 

Ich möchte wissen (höchstwahrscheinlich mit dplyr), wie die Daten der Zeilen auszuschließen die ein Date2 haben, das nach Date1 ist. Dann, um die verbleibenden Daten in einer Zeile zu kombinieren (nach Name sortiert), wobei die früheren Daten mit neueren Ergebnissen ausgeschlossen werden. Schreiben Sie dann einen neuen Datenrahmen, der die Date2-Spalte ausschließt, während Sie immer noch die "NA" in den Daten enthalten.
Wenn keine der Spalte Date2 vor der Spalte Date1 steht, möchte ich den Namen behalten, aber eine Zeile von "NA" (wie im Fall von "John").

So die Ergebnisse wie folgt aussehen sollte:

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> 

Jede auf diese Hilfe wäre sehr dankbar, danke.

+1

Perfect, Andrew Gustar, dass der Trick. Ich kann dir nicht genug für deine Hilfe danken. – Sam

Antwort

1

Dies tun sie mit 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> 
Verwandte Themen