将行折叠成一行并填充 NA

collapsing rows into a single row and filling NA's

我有一个如下所示的数据框:

  ...1                    ...2  ...3        ...4  ...5  ...6  ...7        ...8  ...9  ...10 ...11       ...12 ...13 ...14 ...15      
  <chr>                   <lgl> <chr>       <chr> <chr> <chr> <chr>       <chr> <chr> <chr> <chr>       <chr> <chr> <chr> <chr>      
1 (*) Datos provisionales NA    NA          NA    NA    NA    NA          NA    NA    NA    NA          NA    NA    NA    NA         
2 NA                      NA    Año 2004    NA    NA    NA    Año 2005    NA    NA    NA    Año 2006    NA    NA    NA    Año 2007   
3 NA                      NA    (trimestre) NA    NA    NA    (trimestre) NA    NA    NA    (trimestre) NA    NA    NA    (trimestre)
4 NA                      NA    1º          2º    3º    4º    1º          2º    3º    4º    1º          2º    3º    4º    1º         
5 ANDALUCÍA               NA    NA          NA    NA    NA    NA          NA    NA    NA    NA          NA    NA    NA    NA         
6 Almería                 NA    NA          NA    NA    NA    NA          NA    NA    NA    NA          NA    NA    NA    NA

我想做的是:

  1. Año 2004 分布到 3 NA 列 - 直到 Año 2005,然后对 Año 2005 执行相同操作,依此类推。
  2. 将行 c(3, 4, 5) 折叠成一行。

数据:

df = structure(list(...1 = c("(*) Datos provisionales", NA, NA, NA, 
"ANDALUCÍA", "Almería"), ...2 = c(NA, NA, NA, NA, NA, NA), 
    ...3 = c(NA, "Año 2004", "(trimestre)", "1º", NA, NA), 
    ...4 = c(NA, NA, NA, "2º", NA, NA), ...5 = c(NA, NA, NA, 
    "3º", NA, NA), ...6 = c(NA, NA, NA, "4º", NA, NA), ...7 = c(NA, 
    "Año 2005", "(trimestre)", "1º", NA, NA), ...8 = c(NA, 
    NA, NA, "2º", NA, NA), ...9 = c(NA, NA, NA, "3º", NA, NA
    ), ...10 = c(NA, NA, NA, "4º", NA, NA), ...11 = c(NA, "Año 2006", 
    "(trimestre)", "1º", NA, NA), ...12 = c(NA, NA, NA, "2º", 
    NA, NA), ...13 = c(NA, NA, NA, "3º", NA, NA), ...14 = c(NA, 
    NA, NA, "4º", NA, NA), ...15 = c(NA, "Año 2007", "(trimestre)", 
    "1º", NA, NA)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

对于您的第一个问题,您可以使用带有 apply 的函数 na.locf 来用特定行中的之前值填充即将到来的值:

df[2,] <- t(apply(df[2,], 1, function(x) na.locf(x, fromLast = F, na.rm = F)))

输出:

# A tibble: 6 × 15
  ...1                    ...2  ...3        ...4     ...5     ...6     ...7        ...8     ...9     ...10    ...11       ...12    ...13    ...14 ...15
  <chr>                   <chr> <chr>       <chr>    <chr>    <chr>    <chr>       <chr>    <chr>    <chr>    <chr>       <chr>    <chr>    <chr> <chr>
1 (*) Datos provisionales NA    NA          NA       NA       NA       NA          NA       NA       NA       NA          NA       NA       NA    NA   
2 NA                      NA    Año 2004    Año 2004 Año 2004 Año 2004 Año 2005    Año 2005 Año 2005 Año 2005 Año 2006    Año 2006 Año 2006 Año … Año …
3 NA                      NA    (trimestre) NA       NA       NA       (trimestre) NA       NA       NA       (trimestre) NA       NA       NA    (tri…
4 NA                      NA    1º          2º       3º       4º       1º          2º       3º       4º       1º          2º       3º       4º    1º   
5 ANDALUCÍA               NA    NA          NA       NA       NA       NA          NA       NA       NA       NA          NA       NA       NA    NA   
6 Almería                 NA    NA          NA       NA       NA       NA          NA       NA       NA       NA          NA       NA       NA    NA   

如您所见,值已填满。对于你的第二个问题,我不确定当你覆盖三行中的值时是否有问题,因为情况就是这样。您可以使用此代码:

coalesce_by_column <- function(df) {
  return(dplyr::coalesce(!!! as.list(df)))
}


df[c(3:5),] <-df[c(3:5),] %>% 
  group_by(`...2`) %>% 
  summarise_all(coalesce_by_column)

df <- df %>% distinct()
df

输出:

# A tibble: 4 × 15
  ...1                    ...2      ...3        ...4     ...5     ...6     ...7        ...8     ...9     ...10    ...11       ...12   ...13 ...14 ...15
  <chr>                   <chr>     <chr>       <chr>    <chr>    <chr>    <chr>       <chr>    <chr>    <chr>    <chr>       <chr>   <chr> <chr> <chr>
1 (*) Datos provisionales NA        NA          NA       NA       NA       NA          NA       NA       NA       NA          NA      NA    NA    NA   
2 NA                      NA        Año 2004    Año 2004 Año 2004 Año 2004 Año 2005    Año 2005 Año 2005 Año 2005 Año 2006    Año 20… Año … Año … Año …
3 NA                      ANDALUCÍA (trimestre) 2º       3º       4º       (trimestre) 2º       3º       4º       (trimestre) 2º      3º    4º    (tri…
4 Almería                 NA        NA          NA       NA       NA       NA          NA       NA       NA       NA          NA      NA    NA    NA