Удаление выбранных наблюдений из кадра данных в r

Я хочу удалить 7 строк из большого набора данных (>400 строк), основываясь на значениях в определенном столбце. У меня проблемы с этим простым делом. Любая помощь будет оценена. Ура, C

 ##Generate sample dataset
    Site.Num=c(1:20)
    Year=c(1990:2009)
    Day=c(10:29)
    Final<-data.frame(Site.Num,Year,Day)


 ##I would like to remove 5 rows, based on 5 sites from the Site.Num column
     Final <- Final[which(Final$Site.Num!=c(1,4,10,11,14)), ]


##I receive this error message
    Warning message:
        In Final$Site.Num != c(1, 4, 10, 11, 14) :
        longer object length is not a multiple of shorter object length

2 ответа

Решение

Предупреждение, потому что вы используете != сравнить разные векторы, и рециркуляция произойдет. Однако это предупреждение важно, потому что в этом случае вы запрашиваете другое значение, чем вы ожидаете.

Например (используя == для ясности) если вы хотите увидеть, какие значения c(1,2,2) содержатся в c(1,2)рассмотрим это выражение:

> c(1,2,2) == c(1,2)
[1]  TRUE  TRUE FALSE
Warning message:
In c(1, 2, 2) == c(1, 2) :
  longer object length is not a multiple of shorter object length

но 2 четко в обоих векторах. FALSE значение связано с тем, что вектор справа перерабатывается, поэтому сравниваются фактические значения:

> c(1,2,2) == c(1,2,1)
[1]  TRUE  TRUE FALSE

Однако в первом случае вектор справа не используется повторно целое число раз. Обычно это означает, что вы сделали то, чего не ожидали. Вы хотите, чтобы оператор %in% который дает множество включений:

> c(1,2,2) %in% c(1,2)
[1] TRUE TRUE TRUE

Никаких предупреждений и ожидаемого ответа.

Для вашего вопроса, вот команда для получения желаемых строк:

Final <- Final[!(Final$Site.Num %in% c(1,4,10,11,14)), ]

Обратите внимание, что which не поможет или не повредит в этом утверждении, если набор возвращаемых строк не будет пустым.

С пакетом dplyr вы можете сделать что-то вроде этого.

filter(Final, !Site.Num %in% c(1,4,10,11,14))
Другие вопросы по тегам