我正在使用Stata中的一些数据,我遇到了一个小问题。由于在Stata(我能找到)中没有简单的方法来解决它,我决定尝试用我有限的R知识来解决它。我失败了。
我需要做的是保持观察的位置(default_year - 1)在每年orgnr的年份给出的范围内。换句话说:我只想保留组织(orgnr),如果我每年(年)都有关于它们的信息,直到它们的默认值(default_year)。我的默认信息是否无关紧要。
这段代码在R中会怎样?
我尝试使用子集函数和一些逻辑运算符,但无法使其工作。
事先,谢谢!
orgnr year default_year income
1 2000 2004 100
1 2001 2004 105
1 2002 2004 95
1 2003 2004 75
2 2004 2006 14
2 2005 2006 10
2 2003 2006 6
3 1999 2007 54
3 2000 2007 59
3 1998 2007 50
3 2001 2007 64
3 2002 2007 60
3 2003 2007 51
3 2004 2007 45
3 2005 2007 40
4 2010 2004 5
4 2011 2004 7
5 1999 2000 50
5 1998 2000 45
5 2000 2000 55
5 2001 2000 49
5 2002 2000 51
6 2009 0 10
6 2010 0 12
预期产出:
orgnr year default_year income
1 2000 2004 100
1 2001 2004 105
1 2002 2004 95
1 2003 2004 75
2 2004 2006 14
2 2005 2006 10
2 2003 2006 6
5 1999 2000 50
5 1998 2000 45
5 2000 2000 55
5 2001 2000 49
5 2002 2000 51
6 2009 0 10
6 2010 0 12
答案 0 :(得分:2)
dplyr
我们可以group_by
orgnr
和filter
default_year
在范围内的任何群组。
library(dplyr)
df %>%
group_by(orgnr) %>%
filter(any(max(year) >= (default_year-1) & min(year) <= (default_year -1)))
# orgnr year default_year income
# <int> <int> <int> <int>
# 1 1 2000 2004 100
# 2 1 2001 2004 105
# 3 1 2002 2004 95
# 4 1 2003 2004 75
# 5 2 2004 2006 14
# 6 2 2005 2006 10
# 7 2 2003 2006 6
# 8 5 1999 2000 50
# 9 5 1998 2000 45
#10 5 2000 2000 55
#11 5 2001 2000 49
#12 5 2002 2000 51
修改强>
根据问题中的最新编辑,如果default_year
的值为0,我们可以添加其他条件来检查。
df %>%
group_by(orgnr) %>%
filter(all(default_year == 0) | any(max(year) >= (default_year-1)
& min(year) <= (default_year -1)))
# orgnr year default_year income
# <int> <int> <int> <int>
# 1 1 2000 2004 100
# 2 1 2001 2004 105
# 3 1 2002 2004 95
# 4 1 2003 2004 75
# 5 2 2004 2006 14
# 6 2 2005 2006 10
# 7 2 2003 2006 6
# 8 5 1999 2000 50
# 9 5 1998 2000 45
#10 5 2000 2000 55
#11 5 2001 2000 49
#12 5 2002 2000 51
#13 6 2009 0 10
#14 6 2010 0 12
答案 1 :(得分:0)
only keep observations where the (default_year - 1) for each orgnr is within the range given by year.
这对我来说并不是很清楚。
我假设你要么
一个。将所有行保留在default_year - 1 > year
或
湾将所有行保留在default_year - 1 < year
。
为此,您不需要subset()
功能,只需使用索引:
一个。
df2 <- df[df$default_year - 1 > df$year,]
湾
df2 <- df[df$default_year - 1 < df$year,]
示例:
df <- read.table(text = "orgnr year default_year
1 2000 2004
1 2001 2004
1 2002 2004
1 2003 2004
2 2004 2006
2 2005 2006
2 2003 2006
3 1999 2007
3 2000 2007
3 1998 2007
3 2001 2007
3 2002 2007
3 2003 2007
3 2004 2007
3 2005 2007
4 2010 2004
4 2011 2004
5 1999 2000
5 1998 2000
5 2000 2000
5 2001 2000
5 2002 2000", header = TRUE)
df2 <- df[df$default_year - 1 > df$year,]
> df2
orgnr year default_year
1 1 2000 2004
2 1 2001 2004
3 1 2002 2004
5 2 2004 2006
7 2 2003 2006
8 3 1999 2007
9 3 2000 2007
10 3 1998 2007
11 3 2001 2007
12 3 2002 2007
13 3 2003 2007
14 3 2004 2007
15 3 2005 2007
19 5 1998 2000
df2 <- df[df$default_year - 1 < df$year,]
> df2
orgnr year default_year
16 4 2010 2004
17 4 2011 2004
20 5 2000 2000
21 5 2001 2000
22 5 2002 2000