如何根据两个不同变量的值生成虚拟治疗变量
How to generate a dummy treatment variable based on values from two different variables
我想根据国家变量 "iso" 和地震虚拟变量 "quake"(对于数据集 "data")生成虚拟处理变量 "treatment"。
我基本上想要一个虚拟变量 "treatment",如果在我的整个时间范围内至少有一次 quake==1(比如说 2000-2018),我想要它的所有值"iso" 有 "treatment"==1,对于所有其他国家/地区 "iso"==0。所以受地震影响的国家所有观测值1,其他国家0.
我尝试过使用 dplyr,但由于我对 R 还很陌生,所以我尝试了多次,但我还没有找到解决方案。我看过这个网站 google.
我怀疑解决方案应该类似于以下内容,但我自己无法完成:
data %>%
filter(quake==1) %>%
group_by(iso) %>%
mutate(treatment)
欢迎来到 Whosebug!你真的应该考虑 Sotos 的链接来回答你关于 SO 的下一个问题 :)
这是一个 dplyr
解决方案(根据您的开始):
## data
set.seed(123)
data <- data.frame(year = rep(2000:2002, each = 26),
iso = rep(LETTERS, times = 3),
quake = sample(0:1, 26*3, replace = T))
## solution (dplyr option)
library(dplyr)
data2 <- data %>% arrange(iso) %>%
group_by(iso) %>%
mutate(treatment = if_else(sum(quake) == 0, 0, 1))
data2
# A tibble: 78 x 4
# Groups: iso [26]
year iso quake treatment
<int> <fct> <int> <dbl>
1 2000 A 0 1
2 2001 A 1 1
3 2002 A 1 1
4 2000 B 1 1
5 2001 B 1 1
6 2002 B 0 1
7 2000 C 0 1
8 2001 C 0 1
9 2002 C 1 1
10 2000 D 1 1
# ... with 68 more rows
我想根据国家变量 "iso" 和地震虚拟变量 "quake"(对于数据集 "data")生成虚拟处理变量 "treatment"。
我基本上想要一个虚拟变量 "treatment",如果在我的整个时间范围内至少有一次 quake==1(比如说 2000-2018),我想要它的所有值"iso" 有 "treatment"==1,对于所有其他国家/地区 "iso"==0。所以受地震影响的国家所有观测值1,其他国家0.
我尝试过使用 dplyr,但由于我对 R 还很陌生,所以我尝试了多次,但我还没有找到解决方案。我看过这个网站 google.
我怀疑解决方案应该类似于以下内容,但我自己无法完成:
data %>%
filter(quake==1) %>%
group_by(iso) %>%
mutate(treatment)
欢迎来到 Whosebug!你真的应该考虑 Sotos 的链接来回答你关于 SO 的下一个问题 :)
这是一个 dplyr
解决方案(根据您的开始):
## data
set.seed(123)
data <- data.frame(year = rep(2000:2002, each = 26),
iso = rep(LETTERS, times = 3),
quake = sample(0:1, 26*3, replace = T))
## solution (dplyr option)
library(dplyr)
data2 <- data %>% arrange(iso) %>%
group_by(iso) %>%
mutate(treatment = if_else(sum(quake) == 0, 0, 1))
data2
# A tibble: 78 x 4
# Groups: iso [26]
year iso quake treatment
<int> <fct> <int> <dbl>
1 2000 A 0 1
2 2001 A 1 1
3 2002 A 1 1
4 2000 B 1 1
5 2001 B 1 1
6 2002 B 0 1
7 2000 C 0 1
8 2001 C 0 1
9 2002 C 1 1
10 2000 D 1 1
# ... with 68 more rows