簡體   English   中英

如何在purrr :: map中使用dplyr :: filter

[英]How to use dplyr::filter inside purrr::map

我有一個帶有多個變量的data.frame,我想獲得一個列表,其中每個項目都是使用條件過濾的data.frame的變量。

例如,假設我有類似的東西:

df <- tribble(
  ~ var1, ~ var2, ~ var3,
  4, 0, 0,
  2, 3, 1,
  0, 4, 0
  )
#    var1  var2  var3
#   <dbl> <dbl> <dbl>
# 1     4     0     0
# 2     2     3     1
# 3     0     4     0

我想獲得過濾的變量列表> 0

# $var1
# [1] 4 2
#
# $var2
# [1] 3 4
#
# $var3
# [1] 1

我嘗試了幾件事,但是現在我能得到的最接近的東西是

df %>% map(~filter(df, .>0))

並且我想包含dplyr::select以僅過濾變量。 但是我不知道該怎么做。

感謝您的幫助,也很抱歉英語不好,我希望它仍然可以理解。

我們可以遍歷names 請注意, filter需要data.frame/tbl_df 使用map ,我們遍歷各列,它是一個vector 因此,為了使filter的工作, map通過names ,子集列,應用filterunlist

map(names(df), ~ df %>% 
                  select(.x) %>%
                  filter(. >0) %>%
                  unlist(., use.names = FALSE))

或與split

split.default(df, names(df)) %>%
            map(~  .x %>% 
                       filter(. > 0) %>%
                        pull(1))

注意:OP的問題是How to use dplyr::filter inside purrr::map


不使用dplyr::filter其他方法是

map(df, ~ keep(.x, .x != 0))

要么

map(df, setdiff, 0)

要么

map(df, ~ discard(.x, .x == 0))

或使用base R

lapply(df, setdiff, 0)
#$var1
#[1] 4 2

#$var2
#[1] 3 4

#$var3
#[1] 1

使用purrr::map我們可以做

purrr::map(df, ~.[.!= 0])

#$var1
#[1] 4 2

#$var2
#[1] 3 4

#$var3
#[1] 1

帶有lapply Base R方法可能是

lapply(df, function(x) x[x!= 0])

暫無
暫無

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

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