R dplyr识别一列中的条件序列并改变另一列(或左右)

时间:2015-07-17 17:12:50

标签: r sequence dplyr mutated

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

    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序列,则将闪烁列变为true或false。

预期输出

   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只是错误的测试,因为没有整数。

1 个答案:

答案 0 :(得分: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)