r - 重复出现变量的条件总结
问题描述
我有以下简化的数据框。
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 的循环中。
提前谢谢了!
解决方案
你真的很亲近。使用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 包于 2021-05-04 创建 (v2.0.0 )
推荐阅读
- javascript - 如何表达形成img URL
- ios - UICollectionViewCompositionalLayout + UICollectionViewDiffableDataSource:有没有办法根据部分数据更改装饰视图?
- python - 计算快速排序的比较次数
- amazon-web-services - 我可以依靠 ConnectionId 来确保 API Gateway Websockets 的安全性吗?
- django - 如何在 Django 中重命名“admin”静态文件?
- swiftui - 带有按钮的 SwiftUI NavigationLink
- excel - 使用一个事件处理程序处理多个用户窗体控件 - VBA Excel
- python - 在python的for循环中乘以迭代变量
- python-3.x - pygame.mixer.Sound().play() 没有给出错误但实际上没有播放
- javascript - 尝试创建一个 JS 随机地牢生成器