将行折叠成一行并填充 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
我想做的是:
- 将
Año 2004
分布到 3 NA
列 - 直到 Año 2005
,然后对 Año 2005
执行相同操作,依此类推。
- 将行
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
我有一个如下所示的数据框:
...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
我想做的是:
- 将
Año 2004
分布到 3NA
列 - 直到Año 2005
,然后对Año 2005
执行相同操作,依此类推。 - 将行
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