【问题标题】:Identifying breaks in consecutive values in R识别 R 中连续值的中断
【发布时间】:2018-11-26 19:10:01
【问题描述】:

我在 R 中有一个类似于下面的数据框,其中列是年份和周数,每一行都是特定的人。为了获得特定 ID 的相关输入数据,我有一个指标,即该人是在 2015 年还是 2016 年失业IND15IND16。如果观察结果为“1”,则该人失业,如果观察结果为“0”,则该人被雇用:

ID  y12_01  y12_02  y12_03  y12_04... y12_51  y12_52 y13_01 IND12 IND13  
01    1       1       1       0         0       1        1    1    1   
02    1       1       1       1         1       1        1    1    1   
03    0       0       1       1         0       0        1    1    1   

正如您在上面的示例中看到的那样,一些行显示了 2012 年和 2013 年的失业情况。如果该人从 2015 年开始只有失业序列(只有 1 个),我想创建一个指标,如果这个人在序列中有一个“中断”(即 ID01 或 ID03),我想创建一个指标。

我怀疑部分解决方案可能包括 rowSums 或 while 循环,但到目前为止我还没有运气。在 SAS 中,我认为也许可以使用数组函数,但我再次不确定如何在 R 语言中完成。

【问题讨论】:

  • 我认为如果您有一个包含ID, year, month, unemployment_flag 列的长文件,这将更容易处理。然后,您只需使用任意数量的 R 函数(aggregatedplyr 包、data.table 包)等进行“分组”操作。使用类似于 SAS 数组代码的宽格式工作会过于复杂.事实上,我可能会在 SAS 中做同样的事情 - proc transpose 然后 proc sql + group by 针对长格式数据文件。
  • 转置有什么注意事项吗?当我创建了我需要的指标后,我将删除所有 yyy_ww 列并加入一个带有背景信息的数据框。不过,当我完成指标时,我总是可以将其转回。它已经是一个“长”数据集,因为我有大约 700.000 行。

标签: r loops count time-series


【解决方案1】:

对于问题的第一部分,请尝试df[df$IND15 == 1 & df$IND16 == 1, "Indicator1"] <- 1

对于第二部分,您应该可以使用 for 循环来完成:

for (ID in df$ID){
  if (any(df[ID, 1:x]) == 0){
    df[ID, "Indicator2"] <- 1
  }
}

【讨论】:

  • 我不应该事先定义 x 吗?
  • x 只是您必须查看的列数。在这种情况下,您可以将其替换为 ncol(df) - 2
【解决方案2】:

如果您希望保留宽格式,创建指标的一种方法是将列相乘。使用以下示例数据,

d <- read.table(text = "ID  y12_01  y12_02  y12_03  y12_04  y12_51  y12_52 y13_01 IND15 IND16  
01    1       1       1       0         0       1        1    1    1   
02    1       1       1       1         1       1        1    1    1   
03    0       0       1       1         0       0        1    1    1", 
  header = TRUE, stringsAsFactors = FALSE)

假设相关列是第 2 到 7 列,并且假定值是数字,我们可以创建一个indic

d$indic <- Reduce(`*`, d[, 2:7])
d
#   ID y12_01 y12_02 y12_03 y12_04 y12_51 y12_52 y13_01 IND15 IND16 indic
# 1  1      1      1      1      0      0      1      1     1     1     0
# 2  2      1      1      1      1      1      1      1     1     1     1
# 3  3      0      0      1      1      0      0      1     1     1     0

【讨论】:

  • 1) 你有什么理由把它做成文本吗? 2) 乘法肯定可以部分起作用,但如果一个人以 y12_51 开始他们的失业序列,我会得出 0,并且它会在 2013 年继续,对吗?
猜你喜欢
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多