子集取决于范围内的值

时间:2017-09-19 08:07:50

标签: r subset

我正在使用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

2 个答案:

答案 0 :(得分:2)

dplyr我们可以group_by orgnrfilter 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