Добавить столбец к элементам в списке фреймов данных - PullRequest
1 голос
/ 06 февраля 2020

У меня есть список фреймов данных, где у некоторых есть столбец need, а у других - нет. Как добавить столбец need в другие фреймы данных (со значением = NA)? Я пытался использовать Map или lapply

test <- list(data.frame(need = NA, dont_need = NA),
             data.frame(dont_need = NA),
             data.frame(dont_need = NA, dont_need_2 = NA))

Желаемый вывод

[[1]]
  need dont_need
1   NA        NA

[[2]]
  dont_need need
1        NA   NA

[[3]]
  dont_need dont_need_2 need
1        NA          NA   NA

Я не могу просто использовать привязку, потому что этот список создается динамически, а иногда включает только один кадр данных, который не нет столбца need. Ответ также должен работать, когда это так:

test_2 <- list(data.frame(dont_need = NA))

Ответы [ 4 ]

3 голосов
/ 06 февраля 2020

Одна purrr возможность для ситуаций, когда есть только пустые элементы, может быть:

map(test, ~ list_modify(., need = NA))

[[1]]
  need dont_need
1   NA        NA

[[2]]
  dont_need need
1        NA   NA

[[3]]
  dont_need dont_need_2 need
1        NA          NA   NA

Если могут существовать непустые элементы:

map(test, ~ if(!"need" %in% names(.)) update_list(., need = NA) else .)
1 голос
/ 06 февраля 2020

Другая версия, использующая lapply и is.null. Я добавил некоторые реальные значения в начальные значения data.frame, чтобы показать, что они сохраняются, если они присутствуют изначально.

test <- list(data.frame(need = c(NA, 2), dont_need = 1:2),
             data.frame(dont_need = 1:3),
             data.frame(dont_need = 1:3, dont_need_2 = NA))
> [[1]]
> need dont_need
> NA         1
>  2         2
> 
> [[2]]
> dont_need
>  1
>  2
>  3
> 
> [[3]]
> dont_need dont_need_2
>  1          NA
>  2          NA
>  3          NA


test <- lapply(test, function(df) {
  if (is.null(df[["need"]])) 
    df[["need"]] <- NA

  df
})

> [[1]]
> need dont_need
>  NA         1
>   2         2
> 
> [[2]]
> dont_need need
>  1   NA
>  2   NA
>  3   NA
> 
> [[3]]
> dont_need dont_need_2 need
>  1          NA   NA
>  2          NA   NA
>  3          NA   NA
0 голосов
/ 06 февраля 2020

Вы можете написать функцию, которая проверяет имена столбцов каждого data.frame для need и затем создает его, если его там нет.

test2 <- lapply(test, function(x) {
  if(!"need"%in% colnames(x)){
    x$need <- NA
  }
  return(x)
})

[[1]]
  need dont_need
1   NA        NA

[[2]]
  dont_need need
1        NA   NA

[[3]]
  dont_need dont_need_2 need
1        NA          NA   NA
0 голосов
/ 06 февраля 2020

Вот простой способ использования lapply:

test <- list(data.frame(need = NA, dont_need = NA),
             data.frame(dont_need = NA),
             data.frame(dont_need = NA, dont_need_2 = NA))


lapply(test, function(df) {
  if (!"need" %in% colnames(df)) {
    df$need <- NA
  }
  return(df)
})
#> [[1]]
#>   need dont_need
#> 1   NA        NA
#> 
#> [[2]]
#>   dont_need need
#> 1        NA   NA
#> 
#> [[3]]
#>   dont_need dont_need_2 need
#> 1        NA          NA   NA

Создано в 2020-02-06 пакетом Представить (v0.3.0)

...