假设我有一个包含许多主题和许多测试变量的数据框:
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)如何排除Date2超过Date1的行的数据。然后将剩余数据组合成一行(按名称排列),同时排除具有更新结果的早期数据。然后写一个排除Date2列的新数据框,同时仍包括数据中的&#34; NA&#34; s。 另外,如果Date2列都不在Date1列之前,我想保留Name,但是包含一行&#34; NA&#34; s(如&#34; John&#34;的情况)
所以结果应如下所示:
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>
非常感谢您对此的任何帮助。谢谢。
答案 0 :(得分: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>