r - 在 R 中使用 dplyr/magrittr 删除/删除列

标签 r dplyr

如何在 R 中删除带有 dplyr/magrittr 的列?

这里我想删除 NA 超过 50% 的列(这当然行不通):

delNAcols <- function(x){ ifelse( mean(is.na(x))>0.5, NULL, x ) }
d <- data.frame(x=c(1,2,NA),y=c(NA,NA,4))
d %>% mutate_each(funs(delNAcols))

解决方案

两个答案(来自 user3949008 和 akrun)都很好。

如果处理是在 low 的开头,可以使用两个答案的组合,这是由于简短和 magrittr 风格的最佳平衡,换句话说,最好的可读性:

d %>%
  sapply(function(x) mean(is.na(x)) < 0.5) %>% 
  extract(d,. )

由于 d 的重用,如果它在流程的后面,这将不起作用。然后 user3949008 的答案经过小的改动(和可读性的小改进)后就可以使用了:

d %>% select_(.dots = names(.)[which(sapply(., function(x) mean(is.na(x)) < 0.5))])

如果想让整个事情更简洁,可以这样写

select_each <- function(df, fun) { df %>% sapply(fun) %>% extract(df,.) }
select_each <- function(df, fun) { df %>% select_(.dots = names(.)[which(sapply(., fun))]) }

d %>%
  select_each( function(x) mean(is.na(x)) < 0.5 )

两个 select_each 函数在功能上是相同的。但是,我对它们进行了基准测试,发现第一个的速度是它的三倍。

最佳答案

我们可以使用base R

Filter(function(x) mean(is.na(x)) <= 0.5, d)

或者如果我们需要使用

library(dplyr)
library(magrittr)
d %>%
   summarise_each(funs(mean(is.na(.)) <= 0.5)) %>% 
   unlist %>% 
   extract(d,. )

关于r - 在 R 中使用 dplyr/magrittr 删除/删除列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34612887/

相关文章:

r - 从 dplyr 中的先前值中减去组中的最后一个值

r - 在 R 中运行 httr 库和相互身份验证时 SSL 握手失败

r - data.table 查找值并翻译

r - 日志 y 轴的标签 : 1000 instead of 1e+03?

r - ArcGIS 类似于 R for Rasters 中的拉伸(stretch)配色方案

R:如何阻止看门人中的装饰函数更改次要字符列?

r - 是否可以在 Shiny 的应用程序(renderGrViz)中选择一个graphviz节点,然后链接到其他信息?

r - 时间范围内的 Dplyr 窗口函数而不是行数

r - 如何对未指定的列执行条件变异(例如匹配正则表达式)?

r - dplyr/tidyr 将两列汇总到单个命名列表列中