从r中的数据框中删除选定的观察值

时间:2014-08-23 02:17:33

标签: r subset which

我希望根据特定列中的值从大型数据集(> 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

2 个答案:

答案 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))