如何根据多个 if 条件生成虚拟变量
How to generate dummy variables based on multiple if criteria
我需要在 R 中生成一些虚拟变量,希望您对此提出意见。
在数据集中,每个参与者有 10 个观察值,每个参与者被分配到四种治疗方法 (1,2,3,4) 中的一种。选择是 select 在 10 个任务 (taskno) 中选择“1”或“2”。以下是观察结果。
+----+--------+---------+--------+
| id | taskno | treatno | choice |
+----+--------+---------+--------+
| 1 | 1 | 1 | 1 |
| 1 | 2 | 1 | 2 |
| 1 | 3 | 1 | 2 |
| 1 | 4 | 1 | 2 |
| 1 | 5 | 1 | 1 |
| 1 | 6 | 1 | 1 |
| 1 | 7 | 1 | 1 |
| 1 | 8 | 1 | 1 |
| 1 | 9 | 1 | 1 |
| 1 | 10 | 1 | 1 |
| 2 | 1 | 1 | 1 |
| 2 | 2 | 1 | 1 |
| 2 | 3 | 1 | 2 |
| 2 | 4 | 1 | 2 |
| 2 | 5 | 1 | 1 |
| . | . | . | . |
| . | . | . | . |
+----+--------+---------+--------+
现在,我想生成一个虚拟变量,我们称之为 dummy_1,这样一旦参与者 select 选择 2 且 treatno 为 1,那么 dummy_1 对于同一参与者的所有剩余观察值 (taskno) 应等于 1。
例如,在上面的例子中,参与者 1 select在第二个任务中选择了 2。现在对于参与者 1 的其余观察(任务号:3 到 10),dummy_1 应该等于 1(无论参与者 1 在任务号 3 到 10 中的选择如何)。这同样适用于参与者 2,依此类推。
"dummy_1" 的输出应该是:
+----+--------+---------+--------+---------+
| id | taskno | treatno | choice | dummy_1 |
+----+--------+---------+--------+---------+
| 1 | 1 | 1 | 1 | 0 |
| 1 | 2 | 1 | 2 | 0 |
| 1 | 3 | 1 | 2 | 1 |
| 1 | 4 | 1 | 2 | 1 |
| 1 | 5 | 1 | 1 | 1 |
| 1 | 6 | 1 | 1 | 1 |
| 1 | 7 | 1 | 1 | 1 |
| 1 | 8 | 1 | 1 | 1 |
| 1 | 9 | 1 | 1 | 1 |
| 1 | 10 | 1 | 1 | 1 |
| 2 | 1 | 1 | 1 | 0 |
| 2 | 2 | 1 | 1 | 0 |
| 2 | 3 | 1 | 2 | 0 |
| 2 | 4 | 1 | 2 | 1 |
| 2 | 5 | 1 | 1 | 1 |
| . | . | . | . | . |
| . | . | . | . | . |
+----+--------+---------+--------+---------+
如能提供这方面的帮助,我们将不胜感激。谢谢
使用dplyr
:
library(dplyr)
your_data %>% group_by(id) %>%
arrange(taskno) %>%
mutate(dummy_1 = lag(as.integer(cumsum(choice == 2 & treatno == 1) > 0), default = 0))
我需要在 R 中生成一些虚拟变量,希望您对此提出意见。
在数据集中,每个参与者有 10 个观察值,每个参与者被分配到四种治疗方法 (1,2,3,4) 中的一种。选择是 select 在 10 个任务 (taskno) 中选择“1”或“2”。以下是观察结果。
+----+--------+---------+--------+
| id | taskno | treatno | choice |
+----+--------+---------+--------+
| 1 | 1 | 1 | 1 |
| 1 | 2 | 1 | 2 |
| 1 | 3 | 1 | 2 |
| 1 | 4 | 1 | 2 |
| 1 | 5 | 1 | 1 |
| 1 | 6 | 1 | 1 |
| 1 | 7 | 1 | 1 |
| 1 | 8 | 1 | 1 |
| 1 | 9 | 1 | 1 |
| 1 | 10 | 1 | 1 |
| 2 | 1 | 1 | 1 |
| 2 | 2 | 1 | 1 |
| 2 | 3 | 1 | 2 |
| 2 | 4 | 1 | 2 |
| 2 | 5 | 1 | 1 |
| . | . | . | . |
| . | . | . | . |
+----+--------+---------+--------+
现在,我想生成一个虚拟变量,我们称之为 dummy_1,这样一旦参与者 select 选择 2 且 treatno 为 1,那么 dummy_1 对于同一参与者的所有剩余观察值 (taskno) 应等于 1。
例如,在上面的例子中,参与者 1 select在第二个任务中选择了 2。现在对于参与者 1 的其余观察(任务号:3 到 10),dummy_1 应该等于 1(无论参与者 1 在任务号 3 到 10 中的选择如何)。这同样适用于参与者 2,依此类推。
"dummy_1" 的输出应该是:
+----+--------+---------+--------+---------+
| id | taskno | treatno | choice | dummy_1 |
+----+--------+---------+--------+---------+
| 1 | 1 | 1 | 1 | 0 |
| 1 | 2 | 1 | 2 | 0 |
| 1 | 3 | 1 | 2 | 1 |
| 1 | 4 | 1 | 2 | 1 |
| 1 | 5 | 1 | 1 | 1 |
| 1 | 6 | 1 | 1 | 1 |
| 1 | 7 | 1 | 1 | 1 |
| 1 | 8 | 1 | 1 | 1 |
| 1 | 9 | 1 | 1 | 1 |
| 1 | 10 | 1 | 1 | 1 |
| 2 | 1 | 1 | 1 | 0 |
| 2 | 2 | 1 | 1 | 0 |
| 2 | 3 | 1 | 2 | 0 |
| 2 | 4 | 1 | 2 | 1 |
| 2 | 5 | 1 | 1 | 1 |
| . | . | . | . | . |
| . | . | . | . | . |
+----+--------+---------+--------+---------+
如能提供这方面的帮助,我们将不胜感激。谢谢
使用dplyr
:
library(dplyr)
your_data %>% group_by(id) %>%
arrange(taskno) %>%
mutate(dummy_1 = lag(as.integer(cumsum(choice == 2 & treatno == 1) > 0), default = 0))