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

时间:2019-04-24 13:29:57

标签: r

我有一个带多个变量的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以仅过滤变量。但是我不知道该怎么做。

感谢您的帮助,对英语不佳表示抱歉,希望它仍然可以理解。

2 个答案:

答案 0 :(得分:2)

我们可以遍历names。请注意,filter需要一个data.frame/tbl_df。使用map,我们遍历各列,它是vector。因此,为了使filter起作用,mapnames,将该列作为子集,应用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

答案 1 :(得分:2)

使用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])