2013-08-20 2 views
0

Я действительно борюсь с удалением набора строк из моего набора данных в R.R - Как удалить строки по значению, когда NAs присутствует

У меня есть кадр данных следующим образом:

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 

Я хочу удалить строку R5, исходя из того, что она имеет T в столбце sp. Но я НЕ хочу, чтобы он удалял строки с NA (т. Е. Строки R3 и R4), поскольку мне все еще нужны данные в col1!

Код я использовал:

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

Но это также удаляет все строки с NA в sp колонке (ID сек R3, R4 и R5). Я также попытался:

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

Но это все-таки удалили все три строки - Я только хочу, чтобы удалить один с «Т» в колонке «зр». Я не могу понять это и искал, но не могу найти ответ на эту конкретную проблему. Любая помощь была бы блестящей, так как у меня 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 находится в векторе зр, т.е.

> 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"),] 
Смежные вопросы