r - 在 R 中的 dplyr 中使用带有 mutate 和 case_when 的 shift:未按预期工作
问题描述
我的数据显示瞳孔大小的变化。当值为 -1 时表示闪烁。我已经编写了一些代码来检测眨眼的开始和偏移,但是我在使用shift
函数时遇到了一些问题。
我的数据样本:
library(dplyr)
DataFrame<-structure(list(Pupil_Avg = c(7.174, 6.6910005, 6.518, 2.461,
2.182, 1.942, 1.942, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 1.487, -1, -1, -1, -1, 2.202, 2.202,
2.281, 2.344)), row.names = c(NA, -481L), class = c("tbl_df",
"tbl", "data.frame"))
我对该数据执行的操作:
DataFrame$BLINK_IDENTIFICATION <- ""
# set an arbitrary decrease value in pupil size
Pupil_Constriction = 3
DataFrame<-DataFrame %>%
# removed the columns below as they're not necessary to work on the problem.
#group_by(StimulusName, Name, StimuliBlock) %>%
# if there is a reduction in pupil size of the value in Pupil_Constriction in the current row add "Blink Onset"
mutate(BLINK_IDENTIFICATION = case_when((DataFrame$Pupil_Avg <= (shift(DataFrame$Pupil_Avg, 1L, type="lag")-Pupil_Constriction)) ~ "Blink Onset",
# The next line of code is supposed to check the last row and if "Blink Onset" is contained in the previous row in BLINK_IDENTIFICATION AND the current Pupil_Avg value is NOT equal to -1, then the write "Blink Onset" to the current BLINK_IDENTIFICATION row
( (shift(DataFrame$BLINK_IDENTIFICATION, 1L, type="lag")=="Blink Onset") & (DataFrame$Pupil_Avg != -1) ) ~ "Blink Onset",
# the next line of code write "Blink Offset" if previous row was -1, current is greater than -1, and the next row is NOT -1
( (shift(DataFrame$Pupil_Avg, 1L, type="lag")==-1) & (DataFrame$Pupil_Avg >-1) & (shift(DataFrame$Pupil_Avg, 1L, type="lead")!=-1)) ~ "Blink Offset",
# the next line write "Eye Closed" if current row equals -1
(DataFrame$Pupil_Avg==-1) ~ "Eye Closed"))
我正在尝试根据 Pupil_Avg 中值的变化来检测眨眼的开始和偏移。我的主要问题是代码行( (shift(DataFrame$BLINK_IDENTIFICATION, 1L, type="lag")=="Blink Onset") & (DataFrame$Pupil_Avg != -1) ) ~ "Blink Onset",
该行应该检查 BLINK_IDENTIFICATION 的前一行值,如果它等于“Blink Onset”并且 Pupil_Avg 的当前值不等于 -1:将“Blink Onset”写入当前行的 BLINK_IDENTIFICATION。
当您运行代码时,您会发现这不起作用。我想我不明白如何shift
正确使用函数,因为我认为逻辑是合理的。当然我可能弄错了。
感谢您的时间。
解决方案
可以使用 dplyr 完成 case 语句的 3 个选项:
DataFrame <- DataFrame %>%
mutate(BLINK_IDENTIFICATION = case_when(Pupil_Avg == -1 ~ "Eye Closed",
Pupil_Avg <= lag(Pupil_Avg) - Pupil_Constriction ~ "Blink Onset",
lag(Pupil_Avg) == -1 & Pupil_Avg > -1 & lead(Pupil_Avg) != -1 ~ "Blink Offset",
TRUE ~ ""))
# A tibble: 481 x 2
Pupil_Avg BLINK_IDENTIFICATION
<dbl> <chr>
1 7.17 ""
2 6.69 ""
3 6.52 ""
4 2.46 Blink Onset
5 2.18 ""
6 1.94 ""
7 1.94 ""
8 -1 Eye Closed
9 -1 Eye Closed
10 -1 Eye Closed
# ... with 471 more rows
但是条件lag(BLINK_IDENTIFICATION) == "Blink Onset" & Pupil_Avg != -1
递归地依赖于前一个值(参见第 5、6、7 行)。为此,您需要一个循环。
for(i in 2:nrow(DataFrame)) {
DataFrame$BLINK_IDENTIFICATION[i] = ifelse(DataFrame$BLINK_IDENTIFICATION[i-1] == "Blink Onset" & DataFrame$Pupil_Avg[i] != -1, "Blink Onset", DataFrame$BLINK_IDENTIFICATION[i])
}
DataFrame
# A tibble: 481 x 2
Pupil_Avg BLINK_IDENTIFICATION
<dbl> <chr>
1 7.17 ""
2 6.69 ""
3 6.52 ""
4 2.46 Blink Onset
5 2.18 Blink Onset
6 1.94 Blink Onset
7 1.94 Blink Onset
8 -1 Eye Closed
9 -1 Eye Closed
10 -1 Eye Closed
tail(DataFrame, 10)
# A tibble: 10 x 2
Pupil_Avg BLINK_IDENTIFICATION
<dbl> <chr>
1 -1 Eye Closed
2 1.49 ""
3 -1 Eye Closed
4 -1 Eye Closed
5 -1 Eye Closed
6 -1 Eye Closed
7 2.20 Blink Offset
8 2.20 ""
9 2.28 ""
10 2.34 ""
但是您也可以在 for 循环中完成所有操作。正如您在数据末尾看到的那样,有些空白没有填补。在那里你需要定义你想用它们做什么。保持原样,或填写它们。
推荐阅读
- android - 尝试在空对象引用上调用直接方法 'void
- docker - 来自守护进程的错误响应:找不到网络 ehmnzctsw789v3kjher5rsil6 错误:无法启动容器:mfa-bionix-db-mongo-windows
- python - python请求引发了SSLError,如何解决?
- c++ - C++ 中变量的初始化:= vs {}
- python - 使用 setup.py 构建 Python 多阶段 Docker
- python - 使用并发期货通过多处理运行多个视频
- android - 在材料日历视图中将文本添加到日期
- r - 在 R 中实现 Keras 进行图像分类时出错
- powershell - 通过 Bamboo 的 cmake 命令问题
- putty - 关于腻子和自动登录的问题