面板内的 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
:
在tidyverse
和group_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
假设我的面板数据排列如下:
| 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
:
在tidyverse
和group_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