我有一个与下面的数据集相似的数据集(但有数百万行),我想删除REVENUE列为ALL NA的行(在下面的数据集中,c和e行)。
我在链接(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"))
谢谢!
答案 0 :(得分:2)
您可以使用grep
来查找带有rev
的列,并使用all
和apply
来查找全部为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::vars
和dplyr::starts_with
的列,并删除带有dplyr::filter_at
和dplyr::any_vars
的行。这只是对https://stackoverflow.com/a/51600309/10754831
library(tidyverse)
dat %>%
filter_at(vars(starts_with("rev")), any_vars(!is.na(.)))