如果列列表完全充满了NA,如何删除行(不删除不包含NA以外的至少一个值的行)

时间:2020-01-07 13:48:01

标签: r

我有一个与下面的数据集相似的数据集(但有数百万行),我想删除REVENUE列为ALL NA的行(在下面的数据集中,c和e行)。

enter image description here

我在链接(R - Remove rows which have all NAs in certain columns中看到了类似的帖子,但答案是使用列的位置(我宁愿使用它们的名称),但我不明白它们的含义是“!= 5” ”。

您可以使用以下代码获得可复制的数据集:

dat <-   data.frame(Company = c("a","b","c","d","e","f"), survey_year = c(2014, 2010, 2006, 2014, 2006, 2010), rev_01 = c(NA, 20, NA, NA, NA, 10), 
         rev_02 = c(10, 50, NA, 30, NA, 20), rev_03 = c(20, NA, NA, NA, NA, 30), rev_04 = c(NA, NA, NA, 50, NA, 50), 
         rev_05 = c(NA, 30, NA, NA, NA, 60), variable = c("U", "P", "X", "E", "T","T"))

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用grep来查找带有rev的列,并使用allapply来查找全部为NA的行。

dat[!apply(is.na(dat[,grep("^rev", colnames(dat))]), 1, all),]
#  Company survey_year rev_01 rev_02 rev_03 rev_04 rev_05 variable
#1       a        2014     NA     10     20     NA     NA        U
#2       b        2010     20     50     NA     NA     30        P
#4       d        2014     NA     30     NA     50     NA        E
#6       f        2010     10     20     30     50     60        T

或者您可以像这样使用rowSums

dat[rowSums(!is.na(dat[,grep("^rev", colnames(dat))])) > 0,]

答案 1 :(得分:1)

您可以使用is.na() + rowSums() + subset()来获得所需的输出

subset(dat,rowSums(is.na(dat[grep("rev",names(dat))]))!=5)

这样

> subset(dat,rowSums(is.na(dat[grep("rev",names(dat))]))!=5)
  Company survey_year rev_01 rev_02 rev_03 rev_04 rev_05 variable
1       a        2014     NA     10     20     NA     NA        U
2       b        2010     20     50     NA     NA     30        P
4       d        2014     NA     30     NA     50     NA        E
6       f        2010     10     20     30     50     60        T

答案 2 :(得分:0)

另一种方法是选择带有dplyr::varsdplyr::starts_with的列,并删除带有dplyr::filter_atdplyr::any_vars的行。这只是对https://stackoverflow.com/a/51600309/10754831

的一小部分调整
library(tidyverse)

dat %>% 
  filter_at(vars(starts_with("rev")), any_vars(!is.na(.)))