簡體   English   中英

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(最后一列)為零時,對象閉上眼睛,但眨眼需要一定時間才能執行,此外該設備已經陳舊,並且采樣/記錄速率不是很精確。

我希望有一種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"))

因此,變異比較眨眼= 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM