r - 如何按组 ID 在连续值上创建虚拟变量?
问题描述
我有一个数据框,有些列有 NA 值。此外,数据不平衡(即ID不同年份)。我正在尝试通过组 ID 在连续(多年)重复值上创建一个虚拟变量(在 R 中)。
作为一个例子,我有一个data.frame:
data <- data.frame(Year = c(1980, 1981, 1982, 1983, 1984, 1990, 1991, 1992, 1993,
1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995),
ID = c(1,1,1,1,1, 2,2,2,2, 3,3,3,3,3,3,3,3,3),
value=c(0,0,0,NA,1, 0,1,0,1, NA,NA,0,0,0,0,1,0,0))
Year ID value
1 1980 1 0
2 1981 1 0
3 1982 1 0
4 1983 1 NA
5 1984 1 1
6 1990 2 0
7 1991 2 1
8 1992 2 0
9 1993 2 1
10 1987 3 NA
11 1988 3 NA
12 1989 3 0
13 1990 3 0
14 1991 3 0
15 1992 3 0
16 1993 3 1
17 1994 3 0
18 1995 3 0
我对一个新变量感兴趣,比如“虚拟”,如果在连续 3 年或更长时间内变量“值”的值等于 0,则该变量等于 0,如果值为 NA,则为 NA,其余为 1。例如,在 1980-1982 年间,第一个 ID 应该为零,否则分别为 1 或 NA。
我感兴趣的是:
Year ID value dummy
1 1980 1 0 0
2 1981 1 0 0
3 1982 1 0 0
4 1983 1 NA NA
5 1984 1 1 1
6 1990 2 0 1
7 1991 2 1 1
8 1992 2 0 1
9 1993 2 1 1
10 1987 3 NA NA
11 1988 3 NA NA
12 1989 3 0 0
13 1990 3 0 0
14 1991 3 0 0
15 1992 3 0 0
16 1993 3 1 1
17 1994 3 0 1
18 1994 5 0 1
谁能帮我?
解决方案
您可以使用dplyr按ID对数据进行分组,按ID和Year对数据进行排序以创建新变量。Dummy将为 1,当且仅当(此人今年的)值和前一年和前一年的值都等于 0。因此,1982 年的 ID1 在此示例中具有虚拟值 0。
library(dplyr)
data %>%
group_by(ID) %>%
arrange(ID, Year) %>% ## sort by ID and year
mutate(dummy =
case_when(
value == 0 & lag(value, n = 1) == 0 & lag(value, n = 2) == 0 ~ 0, ## 3 consec years
is.na(value) ~ value, ## if value is NA
TRUE ~ 1 ) ## 1 otherwise
)
# A tibble: 18 x 4
# Groups: ID [3]
Year ID value dummy
<dbl> <dbl> <dbl> <dbl>
1 1980 1 0 1
2 1981 1 0 1
3 1982 1 0 0
4 1983 1 NA NA
5 1984 1 1 1
6 1990 2 0 1
7 1991 2 1 1
8 1992 2 0 1
9 1993 2 1 1
10 1987 3 NA NA
11 1988 3 NA NA
12 1989 3 0 1
13 1990 3 0 1
14 1991 3 0 0
15 1992 3 0 0
16 1993 3 1 1
17 1994 3 0 1
18 1995 3 0 1
推荐阅读
- python - 从python中的SQS消息ID中删除单引号
- azure-functions - Azure Durable Functions going to sleep
- angularjs - How to properly embed MJPEG video in Angular app - Chrome, Edge, other browsers
- javascript - 使用 javascript 从页面获取 csrf 令牌
- node.js - 使用 JUnit 测试 DynamoDB 获得承诺
- php - 将 PHP WebAPI 部署到服务器
- r - 根据R中另一个变量中的不同字符串计算字符串的频率(跨多个变量组合)
- python - Python 脚本不起作用,但也不给出错误
- c++ - 寻找对的更有效方法
- sql - 更改 SQL Server 2008 表添加列