我想删除剩余列中没有信息的ID

I want to delete the IDs that have no information in the remaining columns

这是我的数据集的表示:

Number<-c(1:10)
AA<-c(head(LETTERS,4), rep(NA,6))
BB<-c(head(letters,6), rep(NA,4))
CC<-c(1:6, rep(NA,4))
DD<-c(10:14, rep(NA,5))
EE<-c(3:8, rep(NA,4))
FF<-c(6:1, rep(NA,4))
mydata<-data.frame(Number,AA,BB,CC,DD,EE,FF)

我想自动删除所有在剩余列中没有信息的 ID (Number)。我想告诉函数,如果 Number 中有一个值,但所有剩余列中只有 NA,则删除该行。 我必须有以下数据框:

   Number   AA   BB CC DD EE FF
1       1    A    a  1 10  3  6
2       2    B    b  2 11  4  5
3       3    C    c  3 12  5  4
4       4    D    d  4 13  6  3
5       5 <NA>    e  5 14  7  2
6       6 <NA>    f  6 NA  8  1

一个可能的解决方案,使用janitor::remove_empty

library(dplyr)
library(janitor)

inner_join(mydata, remove_empty(mydata[-1], which = "rows"))

#> Joining, by = c("AA", "BB", "CC", "DD", "EE", "FF")
#>   Number   AA BB CC DD EE FF
#> 1      1    A  a  1 10  3  6
#> 2      2    B  b  2 11  4  5
#> 3      3    C  c  3 12  5  4
#> 4      4    D  d  4 13  6  3
#> 5      5 <NA>  e  5 14  7  2
#> 6      6 <NA>  f  6 NA  8  1

我们可以使用if_all/if_all

library(dplyr)
mydata %>% 
   filter(if_any(-Number, complete.cases))

-输出

  Number   AA BB CC DD EE FF
1      1    A  a  1 10  3  6
2      2    B  b  2 11  4  5
3      3    C  c  3 12  5  4
4      4    D  d  4 13  6  3
5      5 <NA>  e  5 14  7  2
6      6 <NA>  f  6 NA  8  1

mydata %>%
   filter(!if_all(-Number, is.na))

base R

 subset(mydata, rowSums(!is.na(mydata[-1])) >0 )
  Number   AA BB CC DD EE FF
1      1    A  a  1 10  3  6
2      2    B  b  2 11  4  5
3      3    C  c  3 12  5  4
4      4    D  d  4 13  6  3
5      5 <NA>  e  5 14  7  2
6      6 <NA>  f  6 NA  8  1

试试这个:

df <- df[,colSums(is.na(df))<nrow(df)]

虽然这会复制您的数据。如果您有大型数据集,那么您可以使用:

Filter(function(x)!all(is.na(x)), df)

根据您的方法,您可以使用

library(data.table)
DT <- as.data.table(df)
DT[,which(unlist(lapply(DT, function(x)!all(is.na(x))))),with=F]

如果你想使用 data.table,它通常是非常坚固的 go-to

另一种可能的基础 R 解决方案:

mydata[rowSums(is.na(mydata[,-1])) != ncol(mydata[,-1]), ]

输出

  Number   AA BB CC DD EE FF
1      1    A  a  1 10  3  6
2      2    B  b  2 11  4  5
3      3    C  c  3 12  5  4
4      4    D  d  4 13  6  3
5      5 <NA>  e  5 14  7  2
6      6 <NA>  f  6 NA  8  1

或者我们可以使用 apply:

mydata[!apply(mydata[,-1], 1, function(x) all(is.na(x))),]