首页 > 解决方案 > 我该如何正确处理管道?

问题描述

试图使magrittr pinping函数更加优雅和可读。但是,我能做的最好的事情如下。我该如何改进它?请找到参考代码,并提出建议。谢谢

DF <- data.frame(a=letters[1:10], b=1L:10L, c=1.01:1.10, d=rep(TRUE,10), e=10L:1L)

cols <- lapply(DF,class) %>% unlist()
cols[which(cols %in% c("integer","numeric"))]

#        b         c         e 
#"integer" "numeric" "integer"
#
# yet, I'd still like to get rid of the variables.  

我在管道中能做的最好的就是这样。尝试过%$%,但失败了。

(lapply(DF,class) %>% unlist)[
which(lapply(DF,class) %>% unlist() =="integer" |
      lapply(DF,class) %>% unlist() =="numeric")]

我可以把它做成这样吗?

lapply(DF,class) %>% unlist %$% .[which(. %in% c("integer","numeric"))]
# of course, it doesn't work

标签: rmagrittr

解决方案


我们可以使用Filterfrombase R来删除那些带有 classintegernumeric

Filter(function(x) !class(x) %in% c("integer", "numeric"), DF)

为了保持这些变量

Filter(function(x) class(x) %in% c("integer", "numeric"), DF)

或者使用%>%, 获取class带有 的列的map, 检查它是%in%, 'integer' 还是 'numeric' , 取反(!- 仅当我们需要删除这些变量时)和magrittr::extract基于逻辑索引的列

library(tidyverse)
map_chr(DF, class) %>% 
    `%in%`(c("integer", "numeric")) %>% 
    #`!` %>%  #in case to remove those columns
    extract(DF, .)

discard删除列

discard(DF, ~class(.x) %in% c("integer", "numeric"))

keep保留列

keep(DF, ~ class(.x) %in% c("integer", "numeric"))

推荐阅读