我希望根据特定列中的值从大型数据集(> 400行)中删除7行。我有这个简单的努力的问题。任何帮助,将不胜感激。干杯,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
答案 0 :(得分:4)
警告是因为您使用!=
来比较不同的向量,并且会进行回收。但是,此警告很重要,因为在这种情况下,您要求的值与预期的不同。
例如(为了清晰起见,使用==
)如果您想查看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
在此语句中没有帮助或损害,除非返回的行集合为空。
答案 1 :(得分:1)
使用dplyr包,你可以做这样的事情。
filter(Final, !Site.Num %in% c(1,4,10,11,14))