我有一个带多个变量的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
以仅过滤变量。但是我不知道该怎么做。
感谢您的帮助,对英语不佳表示抱歉,希望它仍然可以理解。
答案 0 :(得分:2)
我们可以遍历names
。请注意,filter
需要一个data.frame/tbl_df
。使用map
,我们遍历各列,它是vector
。因此,为了使filter
起作用,map
到names
,将该列作为子集,应用filter
和unlist
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])