我有一个名为total_warnings的矩阵
row day Tx Hx Tn
36 36 5 32.5 37.78 16.3
41 41 10 33.3 41.46 20.5
42 42 11 31.7 41.57 21.2
43 43 12 31.3 39.03 22.2
45 45 14 29.1 37.34 19.0
55 55 24 33.7 41.77 16.4
56 56 25 29.3 38.07 15.9
58 58 27 35.0 41.07 15.3
59 59 28 34.3 40.37 18.5
61 61 30 33.5 40.34 14.9
65 65 4 31.0 37.24 11.4
72 72 11 32.6 40.00 16.2
73 73 12 33.8 40.25 16.8
74 74 13 34.7 41.04 18.6
76 76 15 31.4 39.47 18.4
77 77 16 27.7 37.30 18.4
78 78 17 27.9 38.36 22.3
79 79 18 32.9 42.07 20.1
82 82 21 32.0 38.62 19.3
93 93 1 28.6 37.55 18.1
94 94 2 30.3 39.71 15.3
95 95 3 32.7 39.46 17.5
101 101 9 33.0 39.00 17.4
104 104 12 27.5 37.10 16.7
135 135 12 32.6 38.45 17.7
我尝试做的是在三个或更多连续行之后识别第一行的内容。例如41,42,43是连续三行,我想调用第45行的内容!
45 14 29.1 37.34 19.0
因此,对于此示例,将返回行45,82,101。如果三个或更多连续行之后的行是另一组两个或更多个连续行的一部分,则我不需要知道内容。例如72,73,74是一组,但我不想要第76行,因为它是另一组76,77,78,79的一部分!
提前感谢您的帮助! 尼克
答案 0 :(得分:1)
rle
函数(运行长度编码)可以与diff
函数组合,以识别差异为1且长度大于或等于2的位置。实际的差异操作将名称移动1,因此无需在names()
- 结果中添加1。然后可以使用该字符结果来索引具有rownames的矩阵:
> rle( diff(mat[,'row']))
Run Length Encoding
lengths: Named int [1:19] 1 2 1 1 1 1 1 1 1 1 ...
- attr(*, "names")= chr [1:19] "42" "45" "55" "56" ...
values : Named num [1:19] 5 1 2 10 1 2 1 2 4 7 ...
- attr(*, "names")= chr [1:19] "41" "43" "45" "55" ...
> rdiffs <- rle( diff(mat[,'row']))
> rdiffs$lengths >= 2
42 45 55 56 58 59 61 65 72 73 76 77
FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
82 93 94 101 104 135
TRUE FALSE FALSE TRUE FALSE FALSE FALSE
> attr(rdiffs$lengths,"names")[ rdiffs$lengths >= 2 ]
[1] "45" "76" "82" "101"
> mat [ attr(rdiffs$lengths,"names")[ rdiffs$lengths >= 2 & rdiffs$values == 1] , ]
row day Tx Hx Tn
45 45 14 29.1 37.34 19.0
76 76 15 31.4 39.47 18.4
82 82 21 32.0 38.62 19.3
101 101 9 33.0 39.00 17.4
我还会提出一个可重复的例子:
dn <- scan()
36 36 5 32.5 37.78 16.3
41 41 10 33.3 41.46 20.5
42 42 11 31.7 41.57 21.2
43 43 12 31.3 39.03 22.2
45 45 14 29.1 37.34 19.0
55 55 24 33.7 41.77 16.4
56 56 25 29.3 38.07 15.9
58 58 27 35.0 41.07 15.3
59 59 28 34.3 40.37 18.5
61 61 30 33.5 40.34 14.9
65 65 4 31.0 37.24 11.4
72 72 11 32.6 40.00 16.2
73 73 12 33.8 40.25 16.8
74 74 13 34.7 41.04 18.6
76 76 15 31.4 39.47 18.4
77 77 16 27.7 37.30 18.4
78 78 17 27.9 38.36 22.3
79 79 18 32.9 42.07 20.1
82 82 21 32.0 38.62 19.3
93 93 1 28.6 37.55 18.1
94 94 2 30.3 39.71 15.3
95 95 3 32.7 39.46 17.5
101 101 9 33.0 39.00 17.4
104 104 12 27.5 37.10 16.7
135 135 12 32.6 38.45 17.7
mat <- matrix(dn, ncol=6, byrow=TRUE)
mat<- mat[, -1]
colnames(mat) <- c('row', 'day', 'Tx', 'Hx', 'Tn')
rownames(mat) <-mat[,'row']