合并R中的行,同时排除某些数据

时间:2017-07-06 19:31:04

标签: r dplyr

假设我有一个包含许多主题和许多测试变量的数据框:

   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>

非常感谢您对此的任何帮助。谢谢。

1 个答案:

答案 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>