R中的条件子集设置出错
所以我有一个关于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
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我用其他问题更新了这个问题。我试着用不同的逻辑运算符使用您的解决方案,但它似乎不能产生所需的输出。有什么想法吗?