我很清楚如何根据条件提取一些数据,但每当我尝试多种条件时,都会发生争执。我有一些数据,我只想从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。我错过了什么?
答案 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)),]
小心,但是......切换el
和set
会产生不同的结果,并且可能会让您感到困惑。对于这个例子,请记住“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认为它做的是正确的。