【发布时间】: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