在data.table中以重复顺序查找最长的长度和值

时间:2018-11-22 02:10:57

标签: r data.table

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是其中一种,但我不明白。

2 个答案:

答案 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

我们为每一行计算最长的连续值序列的长度。