Spread and Gather表返回具有NA值的重复行

时间:2019-04-08 03:56:58

标签: r tidyr spread

我有一个表,其中包含以这种形式的列名格式编码的类别和子类别:

  

日期|招生__0 |出勤__0 | Tri_1__0 | Tri_2__0 | ...   Tri_1__1 | Tri_2__1 | ... |

,我想使用tidyverse的散布和收集功能将其更改为这种列格式

  

日期|国家区号|招生|出勤| Tri_1 | Tri_2 | ...

我尝试了一个发布的解决方案,但结果实际上返回的是带有NA的多行,而不是一行。

我使用的代码:

temp <- data %>% gather(key="columns",value ="dt",-Date) 

temp <- temp %>% mutate(category = gsub(".*__","",columns)) %>% mutate(columns = gsub("__\\d","",columns))

temp %>%  mutate(row = row_number()) %>% spread(key="columns",value="dt") 

我的结果是:

Date        country_code   row admissions attendance Tri_1 Tri_2 Tri_3 Tri_4 Tri_5
   <chr>       <chr>        <int> <chr>      <chr>      <chr> <chr> <chr> <chr> <chr>
 1 01-APR-2014 0              275 NA         209        NA    NA    NA    NA    NA   
 2 01-APR-2014 0              640 84         NA         NA    NA    NA    NA    NA   
 3 01-APR-2014 0             1005 NA         NA         5     NA    NA    NA    NA   
 4 01-APR-2014 0             1370 NA         NA         NA    33    NA    NA    NA   
 5 01-APR-2014 0             1735 NA         NA         NA    NA    62    NA    NA   
 6 01-APR-2014 0             2100 NA         NA         NA    NA    NA    80    NA   
 7 01-APR-2014 0             2465 NA         NA         NA    NA    NA    NA    29   
 8 01-APR-2014 1             2830 NA         138        NA    NA    NA    NA    NA   
 9 01-APR-2014 1             3195 66         NA         NA    NA    NA    NA    NA   
10 01-APR-2014 1             3560 NA         NA         N/A   NA    NA    NA    NA  

我的预期结果:

Date        country_code   row admissions attendance Tri_1 Tri_2 Tri_3 Tri_4 Tri_5
   <chr>       <chr>        <int> <chr>      <chr>      <chr> <chr> <chr> <chr> <chr>
 1 01-APR-2014 0              275 84         209        5    33    62    80    29   
 8 01-APR-2014 1             2830 66         138        66   ...   ...   ...   ...   

1 个答案:

答案 0 :(得分:0)

我们可以执行summarise_at coalesce来删除NA之后的spread元素

library(tidyverse)
data %>% 
  gather(key = "columns", val = "dt", -Date, na.rm = TRUE) %>%
  mutate(category = gsub(".*__","",columns)) %>%
  mutate(columns = gsub("__\\d","",columns)) %>% 
  group_by(Date, dt, columns, category) %>% 
  mutate(rn = row_number()) %>%
  spread(columns, dt) %>% 
  select(-V1) %>%
  summarise_at(vars(Admissions:Tri_5),list(~ coalesce(!!! .))) # %>%
  # filter if needed
  #filter_at(vars(Admissions:Tri_5), all_vars(!is.na(.)))