如何在R中删除带有dplyr/magrittr的列?
在这里,我想删除超过50%NAs的列(当然这不起作用):
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)都很好.
如果处理处于低位的开始,则可以使用两个答案的组合,由于短期和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)
或者如果我们需要使用 flow
library(dplyr) library(magrittr) d %>% summarise_each(funs(mean(is.na(.)) <= 0.5)) %>% unlist %>% extract(d,. )