有条件地选择dplyr中的列,其中某些比例的值为NA

时间:2016-01-18 10:12:07

标签: r filter dataframe dplyr na

数据

我正在处理类似于下面生成的set.seed(1) dta <- data.frame(observation = 1:20, valueA = runif(n = 20), valueB = runif(n = 20), valueC = runif(n = 20), valueD = runif(n = 20)) dta[2:5,3] <- NA dta[2:10,4] <- NA dta[7:20,5] <- NA 的数据集:

NA

列中包含NAs个值,最后一列的观察结果超过60%> sapply(dta, function(x) {table(is.na(x))}) $observation FALSE 20 $valueA FALSE 20 $valueB FALSE TRUE 16 4 $valueC FALSE TRUE 11 9 $valueD FALSE TRUE 6 14

dplyr

问题

我希望能够以某种方式将select管道中的列移到base参数中。

尝试

这可以在NAs中轻松完成。例如,要选择小于 50% dta[, colSums(is.na(dta)) < nrow(dta) / 2] 的列,我可以这样做:

> head(dta[, colSums(is.na(dta)) < nrow(dta) / 2], 2)
  observation    valueA    valueB    valueC
1           1 0.2655087 0.9347052 0.8209463
2           2 0.3721239        NA        NA

产生:

dplyr

任务

我有兴趣在Vectorize(require)(package = c("dplyr", # Data manipulation "magrittr"), # Reverse pipe char = TRUE) dta %<>% # Some transformations I'm doing on the data mutate_each(funs(as.numeric)) %>% # I want my select to take place here 管道中实现相同的灵活性:

nextLine

4 个答案:

答案 0 :(得分:14)

或许这样吗?

colMeans

使用colSums而不是colMeans更新了,这意味着您不再需要除以行数。

而且,仅为了记录,在基础R中你也可以使用dta[,colMeans(is.na(dta)) < 0.5]

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("test");
  delay(1000);
}

答案 1 :(得分:5)

现在 dplyr 已达到 1.0.0,其中包含 where()

dta %>% select(where(function(x) sum(is.na(x)) / length(x) < 0.5))

答案 2 :(得分:3)

获得extract

的逻辑向量后,我们可以使用magrittr中的summarise_each/unlist
library(magrittr)
library(dplyr)
dta %>% 
    summarise_each(funs(sum(is.na(.)) < n()/2)) %>% 
    unlist() %>%
    extract(dta,.)

或使用Filter

中的base R
Filter(function(x) sum(is.na(x)) < length(x)/2, dta)

或稍微紧凑的选项是

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

答案 3 :(得分:2)

我认为这可以胜任:

dta %>% select_if(~mean(is.na(.)) < 0.5) %>% head() 


 observation    valueA    valueB    valueC
  1           0.2655087 0.9347052 0.8209463
  2           0.3721239        NA        NA
  3           0.5728534        NA        NA
  4           0.9082078        NA        NA
  5           0.2016819        NA        NA
  6           0.8983897 0.3861141        NA

`