R中的条件子集设置出错

R中的条件子集设置出错,r,subset,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 120

所以我有一个关于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和(not或)year=2005的条件对数据进行子集划分。然而,它似乎不起作用。代码:

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

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

 idnr year
 4    2005

不幸的是,事实并非如此。相反,它将2004年和2005年出现的idnr与2005年才出现的idnr进行了分组。有什么想法吗?

如果您想使用
年==2004
年==2005
进行子集,您需要在实际方法中使用
操作符,而不是
&

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

library(dplyr)
tab3 <- stores %>% select(idnr, year) %>% filter(year == 2004 | year == 2005)
库(dplyr)
表3%选择(idnr,年份)%>%筛选(年份==2004年|年份==2005年)
简而言之:

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

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

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

library(dplyr)
tab3 <- stores %>% select(idnr, year) %>% filter(year == 2004 | year == 2005)
库(dplyr)
表3%选择(idnr,年份)%>%筛选(年份==2004年|年份==2005年)
简而言之:

tab3 <- stores %>% select(idnr, year) %>% filter(year %in% c(2004, 2005)) 
tab3%select(idnr,year)%%>%filter(year%在%c中(2004,2005))
这里有一个使用“data.table”的选项。使用
setDT
将数据集(“df”)转换为“data.table”。将“年”列设置为“键”(
setkey(..)
)。将“年”列中有“2004/2005”的行子集(
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
或者所有的东西都在一条船上

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

这里有一个使用“data.table”的选项。使用
setDT
将数据集(“df”)转换为“data.table”。将“year”列设置为“key”(
setkey(…)
)。将“year”列中包含“2004/2005”的行子集(
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
或者所有的东西都在一条船上

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



您不能同时拥有2004年和2005年。您可以拥有2004年或2005年。这太不幸了,因为我需要根据2004年和2005年的数据来从整个列表中选择数据。因为有些条目只存在于2004年或2005年-这还不够。这就是为什么您需要按照下面的回答执行:使用
|
of
&
。使用|替代包括2004年存在但不在2005年的值,以及其他方式(存在于2005年但不在2004年)。我想做的是,它是2004年和2005年存在的数据的子集。因此,您的第一个声明一点也不清楚。您不能同时拥有2004年和2005年。您可以拥有2004年或2005年。太不幸了,因为我需要根据2004年和2005年是否都存在的数据从整个列表中选择数据。因为有些条目仅在2004年或2005年存在-这还不够。这就是为什么您需要按照下面的回答进行操作:使用
而不是
&
。使用|而包括2004年存在的值,但不包括2005年以及其他情况下存在的值(存在于2005年,但不包括2004年)。我想做的是,它将2004年和2005年存在的数据子集。因此,您的第一个声明根本不清楚。
将$year%存储在%c中(2004,2005)
可以节省一些输入这是如何回答这个问题的?OP不想只在2004年和2005年之前进行筛选。同样如前所述,%
中的
%也会起作用,但我认为这不能解决实际问题question@DavidArenburg:这是对OP最初问题的回答。我不知道您是否注意到,但OP中有两个重要的更新。我只是没有时间跟进和更新答案(我的答案实际上是在akrun的第一枪状态下)。正如Pascal在评论中提到的,第一句话一点也不清楚。
将$year%存储在%c中(2004,2005)
可以节省一些输入这是如何回答这个问题的?OP不想只在2004年和2005年之前进行筛选。同样如前所述,%
中的
%也会起作用,但我认为这不能解决实际问题question@DavidArenburg:这是对OP最初问题的回答。我不知道您是否注意到,但OP中有两个重要的更新.我只是没有时间跟进并更新答案(我的答案实际上处于akrun的第一枪状态)。正如Pascal在评论中提到的,第一条语句一点也不清楚。类似的,但是它仍然包含2005年才开始存在的数据项。我已经包含了我的预期输出。希望clarifies@DavidArenburg我不明白你为什么删除了你的答案。我只是在恭维你的解决方案。因为看起来太像了yours@akrun我用其他问题更新了这个问题。我尝试用不同的逻辑运算符使用您的解决方案,但似乎并没有产生所需的输出。有什么想法吗?类似的想法,但它仍然包括2005年才开始存在的数据项。我已经包括了我的预期输出。希望没有帽子clarifies@DavidArenburg我不明白你为什么删除了你的答案。我只是在恭维你的解决方案。因为它看起来太像了yours@akrun我用其他问题更新了这个问题。我试着用不同的逻辑运算符使用您的解决方案,但它似乎不能产生所需的输出。有什么想法吗?