如何考虑 R 中每个观察结果的后续行和先前行
How to consider following and previous rows of each observation in R
我需要根据几个条件创建 2 列:PRETARGET 和 TARGET。
为我的数据的每一行创建PRETARGET(对于每个参与者PPT和试验TRIAL) 我需要检查 CURRENT_ID 是否与列 CanBePretarget 中的值 0 关联,并且下一行是 CURRENT_ID + 1 的值。如果满足这些条件,那么我希望值为 0,如果不满足值为 1 .
为我的数据的每一行创建 TARGET(对于每个参与者 PPT 和试验 TRIAL) 我需要检查 CURRENT_ID 是否与 CanBeTarget 列中的值 0 关联,并且前一行是 CURRENT_ID - 1 的值。如果满足这些条件,那么我希望值为 0,如果不满足值为 1 .
此外,如果PRETARGET中的结果为1,则TARGET中下一行的值也应为1。
我已在以下示例中添加了所需的输出。
我正在考虑使用 for 循环和 ifelse 语句,但我不确定如何考虑每个观察的 following/previous 行。
PPT TRIAL PREVIOUS_ID CURRENT_ID NEXT_ID CURRENT_INDEX CanBePretarget CanBeTarget PRETARGET TARGET
ppt01 11 2 3 4 3 0 0 0 1
ppt01 11 3 4 3 4 1 0 1 0
ppt01 11 4 5 6 8 0 0 1 1
ppt01 11 6 7 8 10 0 0 1 1
ppt01 11 7 10 11 18 0 1 0 1
ppt01 11 10 11 12 19 0 0 0 0
ppt01 11 11 12 14 20 1 0 1 0
ppt01 12 1 2 1 2 1 0 1 1
ppt01 12 2 3 4 5 0 0 1 1
ppt01 12 5 6 6 8 0 0 0 1
ppt01 12 6 7 7 10 0 0 0 0
ppt01 12 7 8 9 12 0 0 0 0
ppt01 12 8 9 9 13 0 0 0 0
ppt01 12 9 10 11 16 0 0 0 0
ppt01 12 10 11 11 17 0 0 0 0
ppt01 13 1 2 2 2 1 0 1 1
ppt01 13 3 3 3 10 0 0 1 1
ppt01 13 4 5 6 13 0 0 0 1
ppt01 13 5 6 7 14 0 0 1 0
ppt01 13 9 9 10 19 0 0 0 1
ppt01 13 9 10 10 20 0 0 0 0
ppt01 13 10 11 12 22 0 0 0 0
ppt01 13 11 12 12 23 0 0 1 0
ppt01 14 10 11 11 15 0 0 0 1
ppt01 14 11 12 12 17 0 0 1 0
这可以通过使用 dplyr
来实现
df.new <- df %>%
mutate(PRETARGET1 = abs(as.numeric(CanBePretarget == 0 & lead(CURRENT_ID, default = 0) == (CURRENT_ID + 1)) - 1)) %>%
group_by(PPT, TRIAL) %>%
mutate(TARGET1 = abs(as.numeric((CanBeTarget == 0 & lag(CURRENT_ID, default = 0) == (CURRENT_ID - 1)) ) -1),
TARGET1 = ifelse(lag(PRETARGET1, default = 0) == 1, 1, TARGET1))
为了与您的结果进行比较,我创建了 PRETARGET1
和 TARGET1
。
我需要根据几个条件创建 2 列:PRETARGET 和 TARGET。
为我的数据的每一行创建PRETARGET(对于每个参与者PPT和试验TRIAL) 我需要检查 CURRENT_ID 是否与列 CanBePretarget 中的值 0 关联,并且下一行是 CURRENT_ID + 1 的值。如果满足这些条件,那么我希望值为 0,如果不满足值为 1 .
为我的数据的每一行创建 TARGET(对于每个参与者 PPT 和试验 TRIAL) 我需要检查 CURRENT_ID 是否与 CanBeTarget 列中的值 0 关联,并且前一行是 CURRENT_ID - 1 的值。如果满足这些条件,那么我希望值为 0,如果不满足值为 1 .
此外,如果PRETARGET中的结果为1,则TARGET中下一行的值也应为1。
我已在以下示例中添加了所需的输出。
我正在考虑使用 for 循环和 ifelse 语句,但我不确定如何考虑每个观察的 following/previous 行。
PPT TRIAL PREVIOUS_ID CURRENT_ID NEXT_ID CURRENT_INDEX CanBePretarget CanBeTarget PRETARGET TARGET
ppt01 11 2 3 4 3 0 0 0 1
ppt01 11 3 4 3 4 1 0 1 0
ppt01 11 4 5 6 8 0 0 1 1
ppt01 11 6 7 8 10 0 0 1 1
ppt01 11 7 10 11 18 0 1 0 1
ppt01 11 10 11 12 19 0 0 0 0
ppt01 11 11 12 14 20 1 0 1 0
ppt01 12 1 2 1 2 1 0 1 1
ppt01 12 2 3 4 5 0 0 1 1
ppt01 12 5 6 6 8 0 0 0 1
ppt01 12 6 7 7 10 0 0 0 0
ppt01 12 7 8 9 12 0 0 0 0
ppt01 12 8 9 9 13 0 0 0 0
ppt01 12 9 10 11 16 0 0 0 0
ppt01 12 10 11 11 17 0 0 0 0
ppt01 13 1 2 2 2 1 0 1 1
ppt01 13 3 3 3 10 0 0 1 1
ppt01 13 4 5 6 13 0 0 0 1
ppt01 13 5 6 7 14 0 0 1 0
ppt01 13 9 9 10 19 0 0 0 1
ppt01 13 9 10 10 20 0 0 0 0
ppt01 13 10 11 12 22 0 0 0 0
ppt01 13 11 12 12 23 0 0 1 0
ppt01 14 10 11 11 15 0 0 0 1
ppt01 14 11 12 12 17 0 0 1 0
这可以通过使用 dplyr
df.new <- df %>%
mutate(PRETARGET1 = abs(as.numeric(CanBePretarget == 0 & lead(CURRENT_ID, default = 0) == (CURRENT_ID + 1)) - 1)) %>%
group_by(PPT, TRIAL) %>%
mutate(TARGET1 = abs(as.numeric((CanBeTarget == 0 & lag(CURRENT_ID, default = 0) == (CURRENT_ID - 1)) ) -1),
TARGET1 = ifelse(lag(PRETARGET1, default = 0) == 1, 1, TARGET1))
为了与您的结果进行比较,我创建了 PRETARGET1
和 TARGET1
。