dt<-fread( "V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
116 116 116 102 96 96 106 116 116 144
114 114 114 114 114 114 121 111 98 108
88 78 78 77 72 96 96 95 95 95
118 77 77 86 139 127 127 103 93 84
154 154 154 121 121 114 111 111 111 111
175 175 125 125 125 125 164 125 125 141
174 174 125 118 117 116 139 116 102 104
95 95 175 175 176 176 139 123 140 141
140 106 174 162 162 169 140 112 112 112
178 178 178 178 116 95 178 178 178 178")
我想做的是
找到行值和长度的最长序列,如下所示:
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 value length
116 116 116 102 96 96 106 116 116 144 116 3
114 114 114 114 114 114 121 111 98 108 114 6
88 78 78 77 72 96 96 95 95 95 95 3
118 77 77 86 139 127 127 127 93 84 127 3
154 154 154 121 121 114 111 111 111 111 111 4
175 175 125 125 125 125 164 125 125 141 125 4
174 174 125 118 117 116 139 116 102 104 174 2
* 95 95 175 175 176 176 139 123 140 141 95 2*
140 106 174 162 162 169 140 112 112 112 112 3
178 178 178 178 116 95 178 178 178 178 178 5
如果长度相同(95,175,176)*,则选择最小值
我认为rle
是其中一种,但我不明白。
答案 0 :(得分:2)
您可以在执行rle
之前将其转换为长格式。然后,查找最长长度的最小值:
rmax <- melt(dt[, rn:=.I], id.vars="rn")[,
{
r <- rle(value)
m <- max(r$lengths)
.(val=min(r$values[r$lengths==m]), len=m)
},
by=.(rn)]
rmax[dt, on=.(rn)]
输出:
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 rn val len
1: 116 116 116 102 96 96 106 116 116 144 1 116 3
2: 114 114 114 114 114 114 121 111 98 108 2 114 6
3: 88 78 78 77 72 96 96 95 95 95 3 95 3
4: 118 77 77 86 139 127 127 103 93 84 4 77 2
5: 154 154 154 121 121 114 111 111 111 111 5 111 4
6: 175 175 125 125 125 125 164 125 125 141 6 125 4
7: 174 174 125 118 117 116 139 116 102 104 7 174 2
8: 95 95 175 175 176 176 139 123 140 141 8 95 2
9: 140 106 174 162 162 169 140 112 112 112 9 112 3
10: 178 178 178 178 116 95 178 178 178 178 10 178 4
答案 1 :(得分:1)
可能不是一种有效的解决方案,因为它没有利用data.table
语法,而是一种使用apply
的方法
library(data.table)
dt$length <- apply(dt, 1, function(x) max(table(rleid(x))))
dt
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 length
# 1: 116 116 116 102 96 96 106 116 116 144 3
# 2: 114 114 114 114 114 114 121 111 98 108 6
# 3: 88 78 78 77 72 96 96 95 95 95 3
# 4: 118 77 77 86 139 127 127 103 93 84 2
# 5: 154 154 154 121 121 114 111 111 111 111 4
# 6: 175 175 125 125 125 125 164 125 125 141 4
# 7: 174 174 125 118 117 116 139 116 102 104 2
# 8: 95 95 175 175 176 176 139 123 140 141 2
# 9: 140 106 174 162 162 169 140 112 112 112 3
#10: 178 178 178 178 116 95 178 178 178 178 4
我们为每一行计算最长的连续值序列的长度。