r - 我该如何正确处理管道?
问题描述
试图使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
解决方案
我们可以使用Filter
frombase R
来删除那些带有 classinteger
或numeric
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"))
推荐阅读
- typescript - 即使类型“足够相同”,也要在 TypeScript 中强制执行类型层次结构
- wso2 - API 节流是如何实现的?
- java - 是否有用于在 Java 中编码本地时间的类?
- python - 如何在阅读多列时使用 np.where
- java - Optaplanner 不使用其他 BinAvailabilty 来获取分配给事件
- python - 有什么方法可以读取从 Python 网站发送到 Chrome 的 Web 推送通知?
- powershell - 从映射的网络驱动器检索文件时出错
- ruby - 远程服务器不接受密码,ruby 脚本 'net/ssh'
- android - 在片段内单击按钮更改片段
- java - Java 正则表达式匹配\n