パッケージを開発していますが、all-NAである他の列を削除せずに、名前付きのall-NA列を削除したいときに問題が発生します。
これはデータフレームの例です。この例では、2つのすべてNAの列があり、これは予想され、正しいものです。
library(tidyverse)
df <- tribble(
~a, ~b, ~c, ~d, ~AR, ~BR,
1L, "animal", "dog", NA, NA, NA,
2L, "animal", "cat", NA, NA, NA,
3L, "animal", "rat", NA, NA, NA,
4L, "plant", "oak", "carvalho", NA, NA
) %>%
mutate_if(is.logical, as.character)
df
#> # A tibble: 4 x 6
#> a b c d AR BR
#> <int> <chr> <chr> <chr> <chr> <chr>
#> 1 1 animal dog <NA> <NA> <NA>
#> 2 2 animal cat <NA> <NA> <NA>
#> 3 3 animal rat <NA> <NA> <NA>
#> 4 4 plant oak carvalho <NA> <NA>
reprexパッケージ(v0.3.0)によって2020-02-06に作成されました
ただし、b
動物のみを表示するように列をフィルタリングするとします。そのケースでは、3すべて-NAの列を持っているでしょう:d
、AR
とBR
。
df %>%
filter(b == "animal")
df
#> # A tibble: 3 x 6
#> a b c d AR BR
#> <int> <chr> <chr> <chr> <chr> <chr>
#> 1 1 animal dog <NA> <NA> <NA>
#> 2 2 animal cat <NA> <NA> <NA>
#> 3 3 animal rat <NA> <NA> <NA>
reprexパッケージ(v0.3.0)によって2020-02-06に作成されました
私が開発している関数では、上記の場合、d
がall-NAの場合、それは削除されますが、他のすべてのNA列は削除されないようにします。したがって、コンテンツが含まれていてもselect(-d)
、列が完全に削除されるため、は機能しませんd
。
私はすでに、、および-と組み合わせて試しましたがtidyr::drop_na
、成功せずに列のみを削除しました。私は、パイプでうまく機能する方法を探しています。私がこれを行う唯一の方法は、パイプフレンドリーではありません。purrr::discard
dplyr::select_if
all(is.na())
d
if(all(is.na(df$d))) df$d <- NULL
編集:
私が期待している結果は、元のdfで実行すると、元のdfとまったく同じdfを返す関数です。
df
#> # A tibble: 4 x 6
#> a b c d AR BR
#> <int> <chr> <chr> <chr> <chr> <chr>
#> 1 1 animal dog <NA> <NA> <NA>
#> 2 2 animal cat <NA> <NA> <NA>
#> 3 3 animal rat <NA> <NA> <NA>
#> 4 4 plant oak carvalho <NA> <NA>
ただし、列d
がすべてNAの場合、見返りとして次のことを期待しています。
df
#> # A tibble: 3 x 5
#> a b c AR BR
#> <int> <chr> <chr> <chr> <chr>
#> 1 1 animal dog <NA> <NA>
#> 2 2 animal cat <NA> <NA>
#> 3 3 animal rat <NA> <NA>
列名とna以外の値のカウントに、(複数の変数の場合)select_if()
条件を使用してテストできます。%in%
colSums()
df %>%
filter(b == 'animal') %>%
select_if(!names(.) %in% "d" | colSums(!is.na(.)) > 0)
# A tibble: 3 x 5
a b c AR BR
<int> <chr> <chr> <chr> <chr>
1 1 animal dog NA NA
2 2 animal cat NA NA
3 3 animal rat NA NA
df %>%
select_if(!names(.) %in% "d" | colSums(!is.na(.)) > 0)
# A tibble: 4 x 6
a b c d AR BR
<int> <chr> <chr> <chr> <chr> <chr>
1 1 animal dog NA NA NA
2 2 animal cat NA NA NA
3 3 animal rat NA NA NA
4 4 plant oak carvalho NA NA
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加