R - 当存在NA时,如何通过值删除行

时间:2013-08-20 22:00:11

标签: r row na

我真的很想从R中的数据集中删除一组行。

我的数据框如下:

ID    col1   sp  
R1    1.2    F  
R2    2.35   F   
R3    5      NA  
R4    4.3    NA    
R5    2.22   T  
R6    1.35   F

我想根据sp列中有R5的事实删除行T。但我不希望它删除NA行(即行R3和R4),因为我仍然需要col1中的数据!

我使用的代码:

data1<-subset(data,sp!="T")

但是,这也删除了NAsp列R3,R4和R5中ID的所有行。我也尝试过:

data1<-subset(data,sp!="T",na.rm=FALSE)

但这仍然删除了所有三行 - 我只想删除“sp”列中带有“T”的行。我无法弄清楚,并已搜索但无法找到这个具体问题的答案。任何帮助都会很精彩,因为我有1000多行,而不是手动删除它们!感谢。

3 个答案:

答案 0 :(得分:1)

处理此问题的标准方法是使用%in%运算符:

data[!(data$sp %in% "T"),]

答案 1 :(得分:0)

您需要功能is.na和OR(|)运算符的组合:

data1[!data1$sp | is.na(data1$sp),]

使用子集表示法:

subset(data1, !sp | is.na(sp))

答案 2 :(得分:0)

which()命令不显示subset命令具有的问题。例如,

ID = c("R1","R2","R3","R4","R5","R6")
col1 = c(1.2,2.35,5,4.3,2.22,1.35)
sp = c("F","F",NA,NA,"T","F")

data = data.frame(ID,col1,sp)
data1 = data[-which(data$sp=="T"),]

哪个收益率:

> data
  ID col1   sp
1 R1 1.20    F
2 R2 2.35    F
3 R3 5.00 <NA>
4 R4 4.30 <NA>
5 R5 2.22    T
6 R6 1.35    F


> data1
  ID col1   sp
1 R1 1.20    F
2 R2 2.35    F
3 R3 5.00 <NA>
4 R4 4.30 <NA>
6 R6 1.35    F

为确保您完全理解,which()找到T在矢量sp中的位置索引,即

> which(data$sp=="T")
[1] 5