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 识别一列中的条件序列并改变另一列(或左右)的主要内容,如果未能解决你的问题,请参考以下文章