0

我有以下形式的眼动追踪数据:

    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(最后一列)为零时,受试者闭上眼睛,但眨眼需要一定的时间才能执行,此外该设备很旧,采样/记录率不是很精确。

我希望有一种 dplyr 方法,如果 dur 中的零 >= 4 个 0 序列,它可以改变眨眼列的真或假。

预期产出

   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 列来检查设备是否由于视频捕获的低帧率而未能拾取一个闪烁的结束和另一个闪烁的开始。这也可能意味着测试对象只是长时间闭上了眼睛,但任何一种情况都有牵连。我将发布第二种情况的详细信息。

至于第二种情况:闪烁会更长,因此如果您碰巧有“整数”数据,则提供的解决方案可以满足要求。
我没有提供可重现的 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 只是错误的测试,因为没有整数。

4

1 回答 1

1

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)
于 2015-07-17T17:42:08.490 回答