R dplyr 识别一列中的条件序列并改变另一列(或左右)
R dplyr identifying a condition sequence in one column and mutating another (or so)
我有以下形式的眼动追踪数据:
smp x y time dur
1 1 491 798 62 0
2 2 491 798 62 0
3 3 491 798 62 0
4 4 491 798 62 0
5 5 491 798 62 0
6 6 491 798 62 0
7 7 491 798 62 0
8 8 491 798 62 0
9 9 491 798 62 0
10 10 494 798 781 719
11 11 492 794 828 47
12 12 491 787 953 125
13 13 496 625 984 31
14 14 500 535 1046 62
15 15 544 488 1109 63
16 16 567 465 1171 62
17 17 582 453 1234 63
当 dur(最后一列)为零时,受试者闭着眼睛但眨眼需要一定的时间才能执行,而且这个设备很旧而且 sampling/logging 频率不是很精确。
如果 dur 中的零 >= 4 个 0 序列,我希望采用 dplyr 方法将闪烁列突变为真或假。
预期输出
smp x y time dur blink
1 1 491 798 62 0 TRUE
2 2 491 798 62 0 TRUE
3 3 491 798 62 0 TRUE
4 4 491 798 62 0 TRUE
5 5 491 798 62 0 TRUE
6 6 491 798 62 0 TRUE
7 7 491 798 62 0 TRUE
8 8 491 798 62 0 TRUE
9 9 491 798 62 0 TRUE
10 10 494 798 781 719 FALSE
11 11 492 794 828 47 FALSE
12 12 491 787 953 125 FALSE
13 13 496 625 984 31 FALSE
14 14 500 535 1046 62 FALSE
15 15 544 488 1109 63 FALSE
16 16 567 465 1171 62 FALSE
17 17 582 453 1234 63 FALSE
可重现数据
structure(list(smp = 1:17, x = c(491L, 491L, 491L, 491L, 491L,
491L, 491L, 491L, 491L, 494L, 492L, 491L, 496L, 500L, 544L, 567L,
582L), y = c(798L, 798L, 798L, 798L, 798L, 798L, 798L, 798L,
798L, 798L, 794L, 787L, 625L, 535L, 488L, 465L, 453L), time = c(62L,
62L, 62L, 62L, 62L, 62L, 62L, 62L, 62L, 781L, 828L, 953L, 984L,
1046L, 1109L, 1171L, 1234L), dur = c(0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 719L, 47L, 125L, 31L, 62L, 63L, 62L, 63L)), .Names = c("smp",
"x", "y", "time", "dur"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16", "17"))
注意:一方面我想记录实际眨眼,另一方面我想保留仪器在这种情况下呈现的测量不确定性。此外,我想要一个 long_blinks 列来检查设备是否由于视频捕获的低帧率而未能捕捉到一次眨眼的结束和另一次眨眼的开始。这也可能意味着测试对象只是长时间闭上眼睛,但这两种情况都与此有关。我将 post 第二个案例的详细信息。
关于第二种情况:
眨眼时间会更长,因此如果您碰巧有 "integer" 数据,则提供的解决方案可以满足要求。
我的错误是没有提供可复制的 data.frame.
具有数字的可重现数据
structure(list(smp = 1:17, x = c(491, 491, 491, 491, 491,
491, 491, 491, 491, 494, 492, 491, 496, 500, 544, 567,
582), y = c(798, 798, 798, 798, 798, 798, 798, 798,
798, 798, 794, 787, 625, 535, 488, 465, 453), time = c(62,
62, 62, 62, 62, 62, 62, 62, 62, 781, 828, 953, 984,
1046, 1109, 1171, 1234), dur = c(0, 0, 0, 0, 0, 0,
0, 0, 0, 719, 47, 125, 31, 62, 63, 62, 63)), .Names = c("smp",
"x", "y", "time", "dur"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16", "17"))
所以变异比较 blink = dur == 0L 只是错误的测试,因为没有整数。
与dplyr
df %>% group_by(time) %>% mutate(blink = dur==0L & n() >= 4)
# smp x y time dur blink
# 1 1 491 798 62 0 TRUE
# 2 2 491 798 62 0 TRUE
# 3 3 491 798 62 0 TRUE
# 4 4 491 798 62 0 TRUE
# 5 5 491 798 62 0 TRUE
# 6 6 491 798 62 0 TRUE
# 7 7 491 798 62 0 TRUE
# 8 8 491 798 62 0 TRUE
# 9 9 491 798 62 0 TRUE
# 10 10 494 798 781 719 FALSE
# 11 11 492 794 828 47 FALSE
# 12 12 491 787 953 125 FALSE
# 13 13 496 625 984 31 FALSE
# 14 14 500 535 1046 62 FALSE
# 15 15 544 488 1109 63 FALSE
# 16 16 567 465 1171 62 FALSE
# 17 17 582 453 1234 63 FALSE
日期
df <- read.table(text="smp x y time dur
1 1 491 798 62 0
2 2 491 798 62 0
3 3 491 798 62 0
4 4 491 798 62 0
5 5 491 798 62 0
6 6 491 798 62 0
7 7 491 798 62 0
8 8 491 798 62 0
9 9 491 798 62 0
10 10 494 798 781 719
11 11 492 794 828 47
12 12 491 787 953 125
13 13 496 625 984 31
14 14 500 535 1046 62
15 15 544 488 1109 63
16 16 567 465 1171 62
17 17 582 453 1234 63", header=T)
我有以下形式的眼动追踪数据:
smp x y time dur
1 1 491 798 62 0
2 2 491 798 62 0
3 3 491 798 62 0
4 4 491 798 62 0
5 5 491 798 62 0
6 6 491 798 62 0
7 7 491 798 62 0
8 8 491 798 62 0
9 9 491 798 62 0
10 10 494 798 781 719
11 11 492 794 828 47
12 12 491 787 953 125
13 13 496 625 984 31
14 14 500 535 1046 62
15 15 544 488 1109 63
16 16 567 465 1171 62
17 17 582 453 1234 63
当 dur(最后一列)为零时,受试者闭着眼睛但眨眼需要一定的时间才能执行,而且这个设备很旧而且 sampling/logging 频率不是很精确。
如果 dur 中的零 >= 4 个 0 序列,我希望采用 dplyr 方法将闪烁列突变为真或假。
预期输出
smp x y time dur blink
1 1 491 798 62 0 TRUE
2 2 491 798 62 0 TRUE
3 3 491 798 62 0 TRUE
4 4 491 798 62 0 TRUE
5 5 491 798 62 0 TRUE
6 6 491 798 62 0 TRUE
7 7 491 798 62 0 TRUE
8 8 491 798 62 0 TRUE
9 9 491 798 62 0 TRUE
10 10 494 798 781 719 FALSE
11 11 492 794 828 47 FALSE
12 12 491 787 953 125 FALSE
13 13 496 625 984 31 FALSE
14 14 500 535 1046 62 FALSE
15 15 544 488 1109 63 FALSE
16 16 567 465 1171 62 FALSE
17 17 582 453 1234 63 FALSE
可重现数据
structure(list(smp = 1:17, x = c(491L, 491L, 491L, 491L, 491L,
491L, 491L, 491L, 491L, 494L, 492L, 491L, 496L, 500L, 544L, 567L,
582L), y = c(798L, 798L, 798L, 798L, 798L, 798L, 798L, 798L,
798L, 798L, 794L, 787L, 625L, 535L, 488L, 465L, 453L), time = c(62L,
62L, 62L, 62L, 62L, 62L, 62L, 62L, 62L, 781L, 828L, 953L, 984L,
1046L, 1109L, 1171L, 1234L), dur = c(0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 719L, 47L, 125L, 31L, 62L, 63L, 62L, 63L)), .Names = c("smp",
"x", "y", "time", "dur"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16", "17"))
注意:一方面我想记录实际眨眼,另一方面我想保留仪器在这种情况下呈现的测量不确定性。此外,我想要一个 long_blinks 列来检查设备是否由于视频捕获的低帧率而未能捕捉到一次眨眼的结束和另一次眨眼的开始。这也可能意味着测试对象只是长时间闭上眼睛,但这两种情况都与此有关。我将 post 第二个案例的详细信息。
关于第二种情况:
眨眼时间会更长,因此如果您碰巧有 "integer" 数据,则提供的解决方案可以满足要求。
我的错误是没有提供可复制的 data.frame.
具有数字的可重现数据
structure(list(smp = 1:17, x = c(491, 491, 491, 491, 491,
491, 491, 491, 491, 494, 492, 491, 496, 500, 544, 567,
582), y = c(798, 798, 798, 798, 798, 798, 798, 798,
798, 798, 794, 787, 625, 535, 488, 465, 453), time = c(62,
62, 62, 62, 62, 62, 62, 62, 62, 781, 828, 953, 984,
1046, 1109, 1171, 1234), dur = c(0, 0, 0, 0, 0, 0,
0, 0, 0, 719, 47, 125, 31, 62, 63, 62, 63)), .Names = c("smp",
"x", "y", "time", "dur"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16", "17"))
所以变异比较 blink = dur == 0L 只是错误的测试,因为没有整数。
与dplyr
df %>% group_by(time) %>% mutate(blink = dur==0L & n() >= 4)
# smp x y time dur blink
# 1 1 491 798 62 0 TRUE
# 2 2 491 798 62 0 TRUE
# 3 3 491 798 62 0 TRUE
# 4 4 491 798 62 0 TRUE
# 5 5 491 798 62 0 TRUE
# 6 6 491 798 62 0 TRUE
# 7 7 491 798 62 0 TRUE
# 8 8 491 798 62 0 TRUE
# 9 9 491 798 62 0 TRUE
# 10 10 494 798 781 719 FALSE
# 11 11 492 794 828 47 FALSE
# 12 12 491 787 953 125 FALSE
# 13 13 496 625 984 31 FALSE
# 14 14 500 535 1046 62 FALSE
# 15 15 544 488 1109 63 FALSE
# 16 16 567 465 1171 62 FALSE
# 17 17 582 453 1234 63 FALSE
日期
df <- read.table(text="smp x y time dur
1 1 491 798 62 0
2 2 491 798 62 0
3 3 491 798 62 0
4 4 491 798 62 0
5 5 491 798 62 0
6 6 491 798 62 0
7 7 491 798 62 0
8 8 491 798 62 0
9 9 491 798 62 0
10 10 494 798 781 719
11 11 492 794 828 47
12 12 491 787 953 125
13 13 496 625 984 31
14 14 500 535 1046 62
15 15 544 488 1109 63
16 16 567 465 1171 62
17 17 582 453 1234 63", header=T)