所以我对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年的那些组合在一起。任何想法?
答案 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
根据数据集和预期结果显示,我们可以检查&#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