如何在 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/