折叠具有相同日期的行并保留值

Colapse rows wit same date and keep value

我有一个具有以下结构的数据集:

Date AA BB CC DD EE
1/03/2014 0.2 NA NA NA NA
1/03/2014 NA 0.3 NA NA NA
1/03/2014 NA NA 1.2 NA NA
2/03/2014 NA NA NA 3.4 NA
2/03/2014 NA NA NA NA 5.6
3/03/2014 NA 0.5 NA NA NA
3/03/2014 NA NA 1.6 NA NA

我想创建这样的东西:

Date AA BB CC DD EE
1/03/2014 0.2 0.3 1.2 NA NA
2/03/2014 NA NA NA 3.4 5.6
3/03/2014 NA 0.5 1.6 NA NA

我该怎么做?

有了 tidyverse 你可以试试这个:

数据

df <- read.table( text= "Date   AA  BB  CC  DD  EE
1/03/2014   0.2 NA  NA  NA  NA
                  1/03/2014 NA  0.3 NA  NA  NA
                  1/03/2014 NA  NA  1.2 NA  NA
                  2/03/2014 NA  NA  NA  3.4 NA
                  2/03/2014 NA  NA  NA  NA  5.6
                  3/03/2014 NA  0.5 NA  NA  NA
                  3/03/2014 NA  NA  1.6 NA  NA", header = T)

代码

df %>% 
  group_by(Date) %>% 
  fill(AA:EE) %>% 
  slice_tail()

输出

# A tibble: 3 x 6
# Groups:   Date [3]
  Date         AA    BB    CC    DD    EE
  <fct>     <dbl> <dbl> <dbl> <dbl> <dbl>
1 1/03/2014   0.2   0.3   1.2  NA    NA  
2 2/03/2014  NA    NA    NA     3.4   5.6
3 3/03/2014  NA     0.5   1.6  NA    NA  
df %>%
  pivot_longer(-Date)%>%
  na.omit()%>%
  pivot_wider(Date)

# A tibble: 3 x 6
  Date         AA    BB    CC    DD    EE
  <chr>     <dbl> <dbl> <dbl> <dbl> <dbl>
1 1/03/2014   0.2   0.3   1.2  NA    NA  
2 2/03/2014  NA    NA    NA     3.4   5.6
3 3/03/2014  NA     0.5   1.6  NA    NA  

第三个选项将保留每个 Date 的多行(如果可能存在的话)(尽管使用 sort 可以重新排列它们...):

library(dplyr)
dat %>%
  group_by(Date) %>%
  mutate(across(everything(), ~ sort(., na.last = TRUE))) %>%
  filter(if_any(everything(), ~ !is.na(.))) %>%
  ungroup()
# # A tibble: 3 x 6
#   Date         AA    BB    CC    DD    EE
#   <chr>     <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1/03/2014   0.2   0.3   1.2  NA    NA  
# 2 2/03/2014  NA    NA    NA     3.4   5.6
# 3 3/03/2014  NA     0.5   1.6  NA    NA