簡體   English   中英

如何在dplyr的select_if中使用purrr函數

[英]How to use purrr functions inside dplyr's select_if

我正在努力找到最短的dplyr-purr組合。

我可以減少以下結合select_if()map_df()語句嗎?

training.set.imputed %>% 
  select_if(~sum(is.na(.))>0) %>% map_df(~sum(is.na(.)))

我試過這個:

training.set.imputed %>% 
  select_if(~sum(is.na(.))>0, .funs = ~sum(is.na(.)))

這引發了這個錯誤:

錯誤: nm必須為NULL或與x長度相同的字符向量

這是什么意思? 任何想法如何形成.funs術語?

.funs在參數select_if需要重命名功能,而不是一個不同誘變功能,所以你可以做這樣的事情吧,但你不能發生變異的變量值:

tibble(blah = 1:2, bleh = 3:4, bluh = c(NA, NA)) %>% 
    select_if(~ sum(is.na(.x)) > 0, .funs = toupper)

#### OUTPUT ####

# A tibble: 2 x 1
  BLUH 
  <lgl>
1 NA   
2 NA   

如果你堅持使用purrr和dplyr的組合,那么這可能是你最好的選擇(編輯:我剛注意到G.Grothendieck給出了這個答案,但為了完整起見我還是會包括它。)

df %>% 
    map_df(~ sum(is.na(.))) %>% 
    select_if(~ . > 0)

#### OUTPUT ####

# A tibble: 1 x 2
      b     d
  <int> <int>
1     4     1

但是,您可以通過使用dplyr的summarize_if來簡化它:

df %>% 
    summarise_if(anyNA, ~ sum(is.na(.)))

#### OUTPUT ####

# A tibble: 1 x 2
      b     d
  <int> <int>
1     4     1

由於您實際上只是在列總和之后,基本R可能提供最簡潔的選項:

colSums(is.na(df)) %>% 
    .[. > 0]

#### OUTPUT ####

b d 
4 1

數據

structure(list(a = c(2L, 2L, 5L, 10L, 10L, 18L, 18L, 19L, 11L, 
14L, 12L, 10L, 4L, 16L, 5L, 5L, 11L, 2L, 14L, 7L), b = c(10L, 
20L, 16L, NA, 6L, 1L, 11L, 12L, 12L, 12L, 8L, NA, NA, 8L, 11L, 
19L, 8L, 9L, NA, 19L), c = c(11L, 11L, 20L, 8L, 15L, 4L, 17L, 
4L, 4L, 11L, 20L, 11L, 6L, 12L, 17L, 7L, 14L, 18L, 15L, 19L), 
    d = c(19L, 16L, 17L, 14L, 8L, 19L, 7L, 6L, 6L, 13L, 7L, 19L, 
    11L, 17L, NA, 10L, 3L, 3L, 3L, 2L), e = c(12L, 17L, 14L, 
    5L, 8L, 19L, 8L, 3L, 17L, 1L, 2L, 6L, 5L, 17L, 14L, 5L, 8L, 
    2L, 8L, 2L)), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame"))

我假設您希望每列中的NA數量僅保留至少具有1個NA的列。

!)這可以避免代碼重復,也不會出錯。 首先計算每列中的NA數,然后選出大於0的列。

# test input - BOD comes with R
BOD[1,2] <- NA

BOD %>%
  map_df(~ sum(is.na(.))) %>%
  select_if(~ . > 0)

贈送:

# A tibble: 1 x 1
  demand
   <int>
1      1

2)首先選擇具有至少一個NA的那些列,然后在這些列中找到給出相同結果的NA數:

BOD %>%
  select_if(anyNA) %>%
  map_df(~ sum(is.na(.)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM