R中的简单过滤,但具有多个值

时间:2013-08-13 22:40:33

标签: r

我很清楚如何根据条件提取一些数据,但每当我尝试多种条件时,都会发生争执。我有一些数据,我只想从df中提取某些年份。这是一个例子df:

year  value
2006  3
2007  4    
2007  3
2008  5
2008  4
2008  4
2009  5
2009  9
2010  2
2010  8
2011  3
2011  8
2011  7
2012  3
2013  4
2012  6

现在让我们说我只想要2008年,2009年,2010年和2011年。我试试

df<-df[df$year == c("2008", "2009", "2010", "2011"),]

不起作用,所以:

df<-df[df$year == "2008" & df$year == "2009" 
  & df$year == "2010" & df$year == "2011",]

没有错误消息,只是一个空的df。我错过了什么?

5 个答案:

答案 0 :(得分:4)

您需要使用%in%而不是==

 df[df$year %in% c(2008, 2009, 2010, 2011),]



 year value
4  2008     5
5  2008     4
6  2008     4
7  2009     5
8  2009     9
9  2010     2
10 2010     8
11 2011     3
12 2011     8
13 2011     7

答案 1 :(得分:1)

已回答%in%有效,但应使用|&用于AND逻辑,意味着年份需要等于2008年,2009年,2010年和2011年,而您想要的是OR运算符。

df<-df[df$year == "2008" | df$year == "2009" | df$year == "2010" | df$year == "2011",]

答案 2 :(得分:0)

这与@Metrics答案基本相同:

subset(df, year %in% c(2008, 2009, 2010, 2011))

如果您需要%in%的帮助,请参阅?intersect

答案 3 :(得分:0)

如果您不喜欢%in%,请尝试使用is.element功能。您可能会发现它更直观。

df[is.element(el=df[,"year"], set=c(2008:2011)),]

小心,但是......切换elset会产生不同的结果,并且可能会让您感到困惑。对于这个例子,请记住“set”包含你想要的年份的“subSET”。

答案 4 :(得分:0)

这些问题已经得到解答,但我想补充一条关于为什么第一次尝试会产生意外结果的评论。这是R矢量回收的一个很好的例子。

我猜你有

   year  value
6  2008  4
13 2011  8

为什么R做到了这一点?会发生什么是R回收矢量c("2008", "2009", "2010", "2011"),如下所示。

year  value compare
2006  3     2008
2007  4     2009
2007  3     2010
2008  5     2011
2008  4     2008
2008  4     2009
2009  5     2010
2009  9     2011
2010  2     2008
2010  8     2009
2011  3     2010
2011  8     2011
2011  7     2008
2012  3     2009
2013  4     2010
2012  6     2011

你看到将要发生的事吗?当你运行

df<-df[df$year == c("2008", "2009", "2010", "2011"),]

它将返回year列和compare列相等的行。你没有收到警告,因为(偶然)你的比较向量是行数的除数,所以R认为它做的是正确的。