【问题标题】:Subset dependent on a value being within a range依赖于范围内的值的子集
【发布时间】:2018-02-27 22:15:29
【问题描述】:

我在 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

【问题讨论】:

  • year < default year 不起作用?
  • 对不起,在原帖中打错了。我的意思是:(default_year - 1)。我需要在默认年份之前一年。

标签: r subset


【解决方案1】:

使用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

【讨论】:

  • 谢谢,这正是我想要的。最后一个问题(供将来使用):假设 default_year 值为 0,如果值为 0,是否可以添加我们保留观察结果。
  • @IbrahimPelja 抱歉,我没有收到您的问题。
  • 如果组织没有默认,default_year 中的值将为 0。这显然与任何年份值都不匹配(在我的数据集中,年份仅从 1998 年到 2015 年)。如果default_year = 0,是否可以重写代码以使其不会放弃组织
  • 那么如果default_year 为0,您想包含该组织的所有行吗?如果是这种情况,您可以将答案扩展到:df %&gt;% group_by(orgnr) %&gt;% filter(all(default_year == 0) | any(max(year) &gt;= (default_year-1) &amp; min(year) &lt;= (default_year -1)))
【解决方案2】:

only keep observations where the (default_year - 1) for each orgnr is within the range given by year.这对我来说不是很清楚。

我想你要么想要

一个。保留default_year - 1 &gt; year 的所有行

b.保留default_year - 1 &lt; year 所在的所有行。

为此,您不需要subset() 函数,只需使用索引:

一个。

df2 <- df[df$default_year - 1 > df$year,]

b.

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

【讨论】:

  • 抱歉不清楚。在我的问题中添加了一些内容,以使其更清楚。您使用的代码几乎就是我想要的。只有两个问题(1)只要 default_year - 1 在年份范围内,它就不应该删除任何值;(2)由于某种原因,当我运行代码时它说有零行。
  • 抱歉,我还不太清楚。如果我理解正确,代码应该删除 orgnr 3 和 4 的所有行,因为对于 3 缺少 year 2006 并且对于 4 缺少 year 2003?你说up until their default,但是从哪个出发点呢?您能否将数据示例的预期输出手动写入您的问题中,以便我可以看到您想要结束的位置?
  • 我相信你理解正确。在我的问题中添加了预期的输出。对不起我的无能!
  • 谢谢,现在很清楚了。请参阅@RonakShah 的答案以获得很好的解决方案。
猜你喜欢
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 2013-03-26
  • 2015-03-09
  • 2019-08-23
  • 1970-01-01
相关资源
最近更新 更多