2015-07-08 3 views
3
> data = data.frame(a = c(100, -99, 322, 155, 256), b = c(23, 11, 25, 25, -999)) 
> data 
    a b 
1 100 23 
2 -99 11 
3 322 25 
4 155 25 
5 256 -999 

Для такого файла data.frame я хотел бы удалить любую строку, содержащую -99 или -999. Поэтому мой результирующий data.frame должен состоять только из строк 1, 3 и 4.R: как удалить определенные строки в data.frame

Я подумывал написать цикл для этого, но я надеюсь, что есть более простой способ. (Если бы у моего data.frame были столбцы a-z, то метод цикла был бы очень неуклюжим). Мой цикл будет, вероятно, выглядеть как этот

i = 1 
for(i in 1:nrow(data)){ 
    if(data$a[i] < 0){ 
    data = data[-i,] 
    }else if(data$b[i] < 0){ 
    data = data[-i,] 
    }else data = data 
} 
+7

если вы читаете данные, как это, вы могли бы использовать что-то вроде 'read.csv («FILE.CSV», na.strings = с ('NA', '- 99', '- 999')) 'вместо этого и удалить' NA ', который более прямолинейный – rawr

ответ

4

Может быть, это:

ind <- Reduce(`|`,lapply(data,function(x) x %in% c(-99,-999))) 
> data[!ind,] 
    a b 
1 100 23 
3 322 25 
4 155 25 
+0

@BondedDust Вы хотели отредактировать это в своем ответе? ;) (Для записи я предпочитаю ваш.) – joran

+0

Случайное изменение приводов. Не уделять достаточного внимания. Пожалуйста прости. –

6
data [ rowSums(data == -99 | data==-999) == 0 , ] 
    a b 
1 100 23 
3 322 25 
4 155 25 

Оба "==" и "|" (OR) действуют на dataframes как матрицы, возвращая логический объект тех же размеров, что и rowSums.

+1

Отличное решение. Умный трюк с 'rowSums' –

+0

' data [rowSums (sapply (data, \ '% in% \', c (-99, -999))) == 0,] 'как вариант, который может быть более легко расширяемым. – thelatemail

+0

Я полагаю, что это может быть более расширяемым для большего числа возможных отсутствующих маркеров значения, но в этом случае я считаю, что мой все еще больше и самодокументирован. –

1

комментарий @ rawr, вероятно, имеет наибольшее значение для этого при импорте. Тем не менее, вы можете сделать то же, если у вас уже есть данные:

na.omit(replace(data, sapply(data,`%in%`,c(-99,-999)), NA)) 
# a b 
#1 100 23 
#3 322 25 
#4 155 25 
Смежные вопросы