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

Posted

技术标签:

【中文标题】R dplyr 识别一列中的条件序列并改变另一列(或左右)【英文标题】:R dplyr identifying a condition sequence in one column and mutating another (or so) 【发布时间】:2015-10-07 11:50:50 【问题描述】:

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

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

【问题讨论】:

在示例中,dur 中没有任何 >=4 个 0 的零序列。我读对了吗?以及我们如何确切知道“设备是否由于视频捕获的低帧率而未能拾取一次闪烁的结束和另一次闪烁的开始。”? 这个问题需要编辑。您只是在寻找计数序列。剩下的就是浪费时间了。 @MattO'Brien 头部和尾部都有 4+ 个零的序列。但我同意 Pierre 的观点,这个问题有很多似乎没有必要的信息,将数据拆分到 R 中会很烦人,而且根本没有代码。 啊,所以他的意思是跨行的序列,而不是行内的序列。 @MattO'Brien 我认为对齐会让你失望。 dur 是最后一列 【参考方案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)

【讨论】:

所以从某种意义上说,它既是眨眼,又是眨眼时间过长在另一列中注明。 is.blink(t), is.long_blink(t) 作为一种思考方式。但是,这些是闪烁还是任何其他具有与记录速率相比具有某种“正常”速率的情况都没有关系。不可靠性的潜在有用统计是两者之间的差异。这些可能会有用地分成两列进行比较... df %>% group_by(time) %>% mutate(blink = dur == 0.0 & n() >= 4) 虽然只是从 '0L' 中删除 'L' 没有' t 将 0 设置为数字。感谢您的帮助!

以上是关于R dplyr 识别一列中的条件序列并改变另一列(或左右)的主要内容,如果未能解决你的问题,请参考以下文章

在另一列中使用一列中的值

在另一列满足条件后计算一列中的值

R,按另一列中的值缩放直方图计数

如果另一列中的相应行包含特定值,我想使用条件格式突出显示一列中的单元格

一列中相同值的R子集行取决于另一列中的多个值

如何根据另一列中的单元格值有条件地填充熊猫列