面板内的 R 条件值分配

R conditional value assignment within panel

假设我的面板数据排列如下:

| ID | Year | Var1 |
|----|------|------|
|----|------|------|
| 1  | 2010 |  0   |
| 1  | 2012 |  1   |
--------------------
| 2  | 2010 |  3   |
| 2  | 2012 |  2   |
--------------------
| 3  | 2010 |  1   |
| 3  | 2012 |  3   |

或者,在 R 中:

ID <- c(1, 1, 2, 2, 3, 3)

Year <- c(2010, 2012, 2010, 2012, 2010, 2012)

Var1 <- c(0, 1, 3, 2, 1, 3)

df <- data.frame(ID, Year, Var1)

我现在创建 Var2,当每个面板中第二个时间段的 Var1 大于前一个时间段的 Var1 时,它有条件地分配 1,否则分配 0。

在示例table中,当每个 ID 的 Var1 在 2012 年大于 Var1 在 2010 年时,我将在新创建的 Var2 中分配 1,否则分配 0。

看起来像这样:

| ID | Year | Var1 | Var2 |
|----|------|------|------|
|----|------|------|------|
| 1  | 2010 |  0   |  0   |
| 1  | 2012 |  1   |  1   |
---------------------------
| 2  | 2010 |  3   |  0   |
| 2  | 2012 |  2   |  0   |
---------------------------
| 3  | 2010 |  1   |  0   |
| 3  | 2012 |  3   |  1   |

创建 Var2 的 R 代码是什么样的?我想有一个简单的 tidyverse 方法。

您可以使用 diff:

tidyversegroup_by

library(tidyverse)
df %>%
    group_by(ID) %>%
    mutate(Var2 = c(0, +(diff(Var1)) > 0))
## A tibble: 6 x 4
## Groups:   ID [3]
#     ID  Year  Var1  Var2
#  <dbl> <dbl> <dbl> <dbl>
#1    1. 2010.    0.    0.
#2    1. 2012.    1.    1.
#3    2. 2010.    3.    0.
#4    2. 2012.    2.    0.
#5    3. 2010.    1.    0.
#6    3. 2012.    3.    1.

或者在 base R 中使用 ave

transform(df, Var2 = ave(Var1, ID, FUN = function(x) c(0, +(diff(x)) > 0)))
#  ID Year Var1 Var2
#1  1 2010    0    0
#2  1 2012    1    1
#3  2 2010    3    0
#4  2 2012    2    0
#5  3 2010    1    0
#6  3 2012    3    1