2013-08-20 98 views
0

我真的從我的數據集R.的R - 如何通過值刪除行,當NA的存在

刪除一組行的掙扎我有一個數據幀如下:

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列T事實上,除去排R5。但我不希望它與NA(即行R3和R4)刪除行,因爲我還需要在col1的數據!

代碼我使用:

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

但是,也刪除所有與NAsp柱(ID小號R3,R4和R5)的行。我也試過:

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

但是,這仍然刪除了所有三排 - 我只是想在列「SP」刪除帶「T」的一員。我無法弄清楚,已經搜索,但無法找到這個特定問題的答案。任何幫助都會很棒,因爲我有1000多行,而且不需要手動去除它們!謝謝。

回答

0

which()命令不顯示的問題是,子集命令有。例如,

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 
0

你需要的功能is.na和OR(|)運算符的組合:

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

使用子集符號:

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

處理這個問題的標準方法是使用%in%操作:

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