R中的条件子集出错了

时间:2015-02-02 03:05:13

标签: r subset

所以我对R子集有一个相当基本的问题,但因为我是一个新手,我不知道如何正确解决它。我有一些面板数据的例子:

   idnr year  sales space municipality   pop
 1    1 2004 110000  1095          136 71377
 2    1 2005 110000  1095          136 71355
 3    1 2006 110000  1095          136 71837
 4    1 2007 120000  1095          136 72956
 5    2 2004  35000   800          136 71377
 6    3 2004  45000  1000          136 71377
 7    3 2005  45000  1000         2584 23135
 8    3 2006  45000  1000         2584 23258
 9    3 2007  45000  1000         2584 23407
 10   4 2005 180000  5000         2584 23254
 11   4 2006 220000  5000         2584 23135
 12   4 2007 250000  5000         2584 23258

所以我的问题是我想使用year = 2004 AND(not or)year = 2005的条件对数据进行子集化。但是它似乎不起作用。代码:

 tab3 <- stores[stores$year==2004 & stores$year==2005, c("idnr","year")]

我想说的是,我需要选择2004年和2005年都存在的数据,导致某些条目存在于2004年或2005年,但两者都不存在,因此应排除。以上面的数据为例,这应该是输出:

 idnr year
 1    2004
 1    2005
 3    2004
 3    2005

更新

我希望akrun的方法可以用于选择仅在2005年出现的数据条目。这样:

 idnr year
 4    2005

不幸的是,它没有。相反,它将2004年和2005年出现的idnr与仅出现在2005年的那些组合在一起。任何想法?

2 个答案:

答案 0 :(得分:2)

如果您要使用year == 2004 year == 2005进行子集,则需要在实际中使用|运算符而不是&的方法:

tab3 <- stores[stores$year == 2004 | stores$year == 2005, c("idnr", "year")]

结果如何:

#> tab3
#   idnr year
#1     1 2004
#2     1 2005
#5     2 2004
#6     3 2004
#7     3 2005
#10    4 2005

或使用dplyr

library(dplyr)
tab3 <- stores %>% select(idnr, year) %>% filter(year == 2004 | year == 2005)

更简洁:

tab3 <- stores %>% select(idnr, year) %>% filter(year %in% c(2004, 2005)) 

答案 1 :(得分:2)

这是一个使用&#34; data.table&#34;的选项。将数据集(&#34; df&#34;)转换为&#34; data.table&#34;使用setDT。设置&#34;年&#34;列为&#34;键&#34; (setkey(..))。子集具有&#34; 2004/2005&#34;的行。在&#34;年&#34;列(J(c(2004,..)),选择前两列1:2

library(data.table) # data.table_1.9.5 
DT1 <- setkey(setDT(df),year)[J(c(2004,2005)), 1:2, with=FALSE]
DT1
#    idnr year
#1:    1 2004
#2:    2 2004
#3:    3 2004
#4:    1 2005
#5:    3 2005
#6:    4 2005

更新

根据更新的预期结果,我们可以检查是否有多个独特的&#34;年&#34;条目(uniqueN(year)>1)per&#34; idnr&#34; group,获取行索引(.I)作为列(&#34; V1&#34;)并将data.table&#34; DT1&#34;。

分组。
 DT1[DT1[, .I[uniqueN(year)>1], idnr]$V1,]
 #     idnr year
 #1:    1 2004
 #2:    1 2005
 #3:    3 2004
 #4:    3 2005

或一条线上的所有内容

setDT(df)[year %in% 2004:2005, if(uniqueN(year) > 1L) year, idnr]
#    idnr   V1
# 1:    1 2004
# 2:    1 2005
# 3:    3 2004
# 4:    3 2005

base R选项

 indx <- with(df, ave(year==2004, idnr, FUN=any)& ave(year==2005, 
                     idnr, FUN=any) & year %in% 2004:2005)
 df[indx,1:2]
 #  idnr year
 #1    1 2004
 #2    1 2005
 #6    3 2004
 #7    3 2005

UPDATE2

根据数据集和预期结果显示,我们可以检查&#34;年&#34;的第一个值。是每个组的2005年&#34; idnr&#34;。如果为TRUE,则对第一个观察(.SD[1L,..])进行子集化,并选择所需的列。

   setDT(df)[,if(year[1L]==2005) .SD[1L,1,with=FALSE], by = idnr]
   #   idnr year
   #1:    4 2005

或者

   setDT(df)[df[,.I[year[1L]==2005] , by = idnr]$V1[1L], 1:2, with=FALSE]
   #   idnr year
   #1:    4 2005