我有一个大型数据集,我想为其创建 50 个新变量,其中的值取决于先前列中的值,并且变量的名称反映了这一事实。为了更容易理解,这里举个例子:
df <- tibble("a" = runif(10,1990,2000),
"event" = 1995) %>%
mutate("relative_event" = a - event)
现在有了这个数据集,我想创建虚拟变量,如果具体观察是在事件发生前一年、前 2 年等,以及向前,则编码。一种笨拙的方法(有效)是:
df <- df %>%
mutate("event_b1" = ifelse( (relative_event<=0) & (relative_event > -1),1,0)) %>%
mutate("event_b2" = ifelse( (relative_event<=-1) & (relative_event > -2),1,0)) %>% #etc with more lagx
mutate("event_f1" = ifelse( (relative_event>0) & (relative_event < 1),1,0)) %>%
mutate("event_f2" = ifelse( (relative_event>1) & (relative_event < 2 ),1,0)) #etc with more forward
其中 b1 代表“一年前”,f2 代表“两年前”。结果如下所示:
A tibble: 10 x 7
a event relative_event event_b1 event_b2 event_f1 event_f2
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1993. 1995 -1.94 0 1 0 0
2 1992. 1995 -2.59 0 0 0 0
3 2000. 1995 4.75 0 0 0 0
4 1998. 1995 3.25 0 0 0 0
5 1991. 1995 -3.88 0 0 0 0
6 1992. 1995 -3.02 0 0 0 0
7 1996. 1995 1.08 0 0 0 1
8 1994. 1995 -1.04 0 1 0 0
9 1993. 1995 -2.22 0 0 0 0
10 1995. 1995 -0.302 1 0 0 0
由于我有 50 多个列要创建,我想知道如何自动创建,这样我就不必复制粘贴 49 次并手动更改条件和变量名。我花了一些时间在这个线程、这个线程和 CV上查看 SO ,但我仍然一无所知。我尝试了以下不起作用的代码:
for (i in 0:10) {
if (i<0) {
event_bi <- paste0("event_b",i)
df <- df %>%
mutate(get(event_bi) = ifelse((relative_event<=-(i-1)) & (relative_event>-i),1,0))
}
}
理想情况下,我想学习如何使用 dplyr 进行操作,但如果有明显的 Base R 解决方案,我也很乐意学习它。
谢谢!