假设我有一个数据集,其中包含多个人在多个年份的观察结果。每个人每年可以处于两种状态(A或B)中的一种。我有每个人每年所处状态的数据,并创建了一个虚拟变量Status_change
,如果当前年份的状态与去年的状态不同,则该变量等于1。因此,我的数据当前如下所示:
Individual| Year | Status | Status_change |
-------------------------------------------
1 | 1 | A | NA |
1 | 2 | A | 0 |
1 | 3 | A | 0 |
1 | 4 | B | 1 |
我想创建一个新变量,用来度量个体在同一状态下保持了多长时间,我们将其命名为Duration
,在上面的例子中,它看起来如下:
Individual| Year | Status | Status_change | Duration |
------------------------------------------------------
1 | 1 | A | NA | 0 |
1 | 2 | A | 0 | 1 |
1 | 3 | A | 0 | 2 |
1 | 4 | B | 1 | 0 |
实际上,我正在寻找一个变量,该变量在第1年的所有个体中初始值为0,并且只要状态保持不变,每个周期增长1个单位。如果状态切换,则变量再次取值为0,整个过程重新开始。到目前为止,我尝试了以下操作:
data%>%
group_by(Individual)%>%
arrange(Year, .by_group = TRUE)%>%
mutate(Duration = ifelse(Year == 1, 0, ifelse(Status_Change == 1, 0, lag(Duration) + 1)))
但这给了我一个错误:
Error: Problem with `mutate()` column `Duration`.
i `Duration = ifelse(Year == 1, 0, ifelse(Status_Change == 1, 0, lag(Duration) + 1))`.
x could not find function "Duration"
i The error occurred in group 1: Individual = "1"
我将非常感谢你能给予我的任何帮助!提前感谢!
2条答案
按热度按时间8i9zcol21#
这应该可以做到:
注意,我们不能只按个体和状态分组--我们需要创建一个中间变量来Map状态的变化,这样从A到B再回到A的转换就被视为三个状态,而不是两个。
des4xlb02#
绕过
status_change
-变量怎么样?输出:
数据(下次请自行添加:-))