Tambahkan kolom ke elemen dalam daftar kerangka data

Saya memiliki daftar bingkai data yang beberapa memiliki kolom need dan yang lainnya tidak. Bagaimana cara menambahkan kolom need ke bingkai data lainnya (dengan nilai = NA)? Saya sudah mencoba menggunakan Map atau lapply

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

Keluaran yang Diinginkan

[[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

Saya tidak bisa hanya menggunakan pengikatan karena daftar ini dibuat secara dinamis dan terkadang hanya menyertakan satu kerangka data yang tidak memiliki kolom need. Jawabannya juga harus berhasil jika hal ini terjadi:

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

person MayaGans    schedule 06.02.2020    source sumber


Jawaban (4)


Satu purrr kemungkinan untuk situasi ketika hanya ada elemen kosong adalah:

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

Jika mungkin ada elemen yang tidak kosong:

map(test, ~ if(!"need" %in% names(.)) update_list(., need = NA) else .)
person tmfmnk    schedule 06.02.2020
comment
Anda harus menyertakan library(purrr) dalam jawaban Anda agar lebih jelas bagi orang yang belum mengetahuinya. - person Gallarus; 06.02.2020
comment
Sebenarnya jawaban ini akan menghilangkan nilai pada kolom need jika sudah ada dan bukan NA - person Gallarus; 06.02.2020
comment
@Gallarus itulah alasan mengapa saya sebenarnya juga menyertakan solusi untuk elemen yang ada tidak kosong. - person tmfmnk; 06.02.2020
comment
kalau salahku, aku terlalu cepat dalam menilai, maaf - person Gallarus; 06.02.2020

Versi lain menggunakan lapply dan is.null. Saya menambahkan beberapa nilai nyata di data.frame awal untuk menunjukkan bahwa nilai tersebut dipertahankan jika ada pada awalnya.

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
person Gallarus    schedule 06.02.2020
comment
Terima kasih! Karena tergesa-gesa membuat repex, saya menyadari bahwa tidak memiliki nilai dalam bingkai data asli membingungkan jawabannya, karena di bawah ini orang menyarankan untuk mengganti semua kebutuhan dengan NA. - person MayaGans; 06.02.2020
comment
Jawaban purrr dari @tmfmnk sebenarnya benar dan saya salah. Saya menyediakan versi yang tidak menghilangkan nilai-nilai yang sudah ada - person Gallarus; 06.02.2020

Berikut ini cara mudah menggunakan 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

Dibuat pada 06-02-2020 oleh paket reprex (v0.3.0)

person JBGruber    schedule 06.02.2020

Anda dapat menulis fungsi yang memeriksa nama kolom masing-masing data.frame untuk need dan kemudian membuatnya jika tidak ada.

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
person mfidino    schedule 06.02.2020