1

我很清楚如何根据一个条件提取一些数据,但是每当我尝试多个条件时,就会发生争执。我有一些数据,我只想从 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。我错过了什么?

4

5 回答 5

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
于 2013-08-13T22:43:05.813 回答
1

正如回答的%in%作品,但应该使用|. 这&是 AND 逻辑,这意味着年份需要等于 2008、2009、2010 AND 2011,而您想要的是 OR 运算符。

df<-df[df$year == "2008" | df$year == "2009" | df$year == "2010" | df$year == "2011",]
于 2013-08-13T22:46:52.307 回答
0

这与@Metrics 答案基本相同:

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

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

于 2013-08-13T22:49:06.753 回答
0

如果你不喜欢%in%,试试这个功能is.element。您可能会发现它更直观。

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

不过要小心……切换elset给出不同的结果,并且可能会混淆您想要的方式。对于此示例,请记住“set”包含您想要的年份的“subSET”。

于 2013-08-13T22:54:47.433 回答
0

问题已得到解答,但我想添加评论,说明为什么您的第一次尝试会产生意想不到的结果。这是 R 的向量回收的一个很好的例子。

我猜你有

   year  value
6  2008  4
13 2011  8

R为什么要这样做?发生的事情是 Rc("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 认为它在做正确的事情。

于 2013-08-14T00:15:09.360 回答