【问题标题】:conditional summarising of reoccuring variables循环变量的条件总结
【发布时间】:2021-05-04 12:31:38
【问题描述】:

我有以下简化的数据框。

obj <- data.frame (id = c(1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2),
Date = c("1990-01", "1990-02", "1990-03", "1990-04", "1990-01", "1990-02", "1990-03", "1990-04", "1991-01", "1991-02", "1991-03", "1991-04", "1991-01", "1991-02", "1991-03", "1991-04"),
                   degree = c(1, 1, 1, 2, 1, 1, 0, 1, 2, 2, 2, 2, 1, 1, 2, 2)
)

请注意,我的真实 ID 的名称类似于 2.01811e+13

我想做的是:

  • 我想创建一个新列,对于度数变为 2 且先前观察值为 1 的日期,该列应为 1,但如果变量 ID 保持不变,它应该保持不变。
  • 对于每个度数 = 1,新列应为零。
  • 对于任何度数 = 0,新列都应采用 NA。
  • 对于任何其他度数 = 2(因此,如果同一 id 观察的先前度数不是 1),新列也应为 NA。 请注意,在真实样本中,连续的 id 观察可能会在不同年份重叠,例如ID 范围为 1990-11、1990-12、1991-01、1991-02。

应该是这样的,

id date    degree new_col 
1   1990-01   1     0
1   1990-02   1     0 
1   1990-03   1     0
1   1990-04   2     1
2   1990-01   1     0
2   1990-02   1     0
2   1990-03   0     NA
2   1990-04   1     0
1   1991-01   2     NA
1   1991-02   2     NA
1   1991-03   2     NA
1   1991-04   2     NA
2   1991-01   1     0
2   1991-02   1     0
2   1991-03   2     1
2   1991-04   2     0

我猜的方法是为每个ID写一个for循环

case_when(degree == 2 & lag(degree) == 1 ~ 1,
                                degree == 1 ~ 0,
                                T ~ NA_real_))

但我不确定如何将上面的代码准确地合并到依赖于 ID 的循环中。

提前非常感谢!

【问题讨论】:

  • 能否请您澄清一下“但如果变量 ID 保持不变,它应该成立”。在您的第一个要点中?
  • 当然!每个 ID 在我的整个数据集中出现两次,总是连续出现 4 次。如果变量 degree 从 1 变为 2 并且变量 ID 相同,则 new_col 应取值 1。另一方面,如果变量 degree 从 1(其中 ID=1)变为 2(其中 ID=2) new_col 应该是 NA。最好的问候1
  • 好的,这真的很有帮助:已更新答案以反映此逻辑

标签: r


【解决方案1】:

你真的很亲密。使用dplyr 你可以这样做:

library(dplyr)

obj %>% 
  mutate(new_col= case_when(degree == 2 & lag(degree) == 1 & id == lag(id) ~ 1,
                            degree == 2  & lag(degree) == 1  & id == 2 & lag(id) == 1 ~ 0,
                            degree == 1 ~ 0,
                            T ~ NA_real_)) 
#>    id    Date degree new_col
#> 1   1 1990-01      1       0
#> 2   1 1990-02      1       0
#> 3   1 1990-03      1       0
#> 4   1 1990-04      2       1
#> 5   2 1990-01      1       0
#> 6   2 1990-02      1       0
#> 7   2 1990-03      0      NA
#> 8   2 1990-04      1       0
#> 9   1 1991-01      2      NA
#> 10  1 1991-02      2      NA
#> 11  1 1991-03      2      NA
#> 12  1 1991-04      2      NA
#> 13  2 1991-01      1       0
#> 14  2 1991-02      1       0
#> 15  2 1991-03      2       1
#> 16  2 1991-04      2      NA

reprex package (v2.0.0) 于 2021-05-04 创建

【讨论】:

    猜你喜欢
    • 2011-10-04
    • 2021-02-16
    • 1970-01-01
    • 2020-03-27
    • 2013-05-15
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多