Удаление выбранных наблюдений из кадра данных в 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))