在R中创建持续时间变量

ff29svar  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(123)

假设我有一个数据集,其中包含多个人在多个年份的观察结果。每个人每年可以处于两种状态(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"

我将非常感谢你能给予我的任何帮助!提前感谢!

8i9zcol2

8i9zcol21#

这应该可以做到:

library(dplyr)

data |>
  group_by(Individual) |>
  arrange(Year, .by_group = TRUE) |>
  ungroup() |> 
  mutate(
         ## Replace the initial NA in Status Change,
         ## which will break this code.
         Status_Change = tidyr::replace_na(Status_Change, 0),
         ## Create a variable that increases by one every time
         ## the status changes.
         Status_State  = cumsum(Status_Change)) |>
  ## Duration is just the current row_number() for each state of
  ## individual
  group_by(Individual, Status_State) |> 
  mutate(Duration = row_number()) |> 
  ungroup()

注意,我们不能只按个体和状态分组--我们需要创建一个中间变量来Map状态的变化,这样从A到B再回到A的转换就被视为三个状态,而不是两个。

des4xlb0

des4xlb02#

绕过status_change-变量怎么样?

library(dplyr)

df |>
  group_by(Individual, Status) |>
  arrange(Year) |>
  mutate(Duration = row_number()-1) |>
  ungroup()

输出:

# A tibble: 4 × 5
  individual  year status status_change duration
       <dbl> <int> <chr>          <dbl>    <int>
1          1     1 A                 NA        0
2          1     2 A                  0        1
3          1     3 A                  0        2
4          1     4 B                  1        0

数据(下次请自行添加:-))

df <- tibble(Individual = c(1,1,1,1),
             Year = 1:4,
             Status = c("A", "A", "A", "B"),
             Status_change = c(NA, 0, 0, 1))

相关问题