我想删除剩余列中没有信息的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))),]
这是我的数据集的表示:
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))),]