R中具有不同间隔的序列:匹配传感器数据

时间:2015-07-17 14:44:57

标签: r time-series sequence sensor matching

我需要一个以不同间隔重复序列中数字的向量。我基本上需要这个

 c(rep(1:42, each=6), rep(43:64, each = 7),
 rep(65:106, each=6), rep(107:128, each = 7),

....但我需要继续这样做,直到将近200万。 所以我想要一个看起来像

的矢量
[1] 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 ...
.....
[252] 43 43 43 43 43 43 43 44 44 44 44 44 44 44 
....
[400] 64 64 64 64 64 64 65 65 65 65 65 65...

等等。不仅仅是在6到7次重复之间交替,而是大多数是6s和更少的7s,直到整个矢量大约是170万行。那么,我能做一个循环吗?或申请,复制?我需要向量中的第400个条目为64,第800个条目为128,依此类推,有些均匀间隔的整数。

更新

谢谢大家快速巧妙的伎俩。它起作用,至少足以满足我所处理的最后期限。我意识到重复6 xs和7 xs是尝试解决这个问题的一种非常愚蠢的方法,但它至少很快。但是现在我有一些时间,我想在这里得到每个人对我真正的基本问题的意见/想法。

我有两个要合并的数据集。它们都是传感器数据集,都以秒表时间为主键。但是每1/400秒记录一次,另一次记录每1/256秒记录一次。我已经修剪了每个顶部,以便它们开始完全相同的时刻。但是..现在怎么样?我在一组中每秒有400条记录,在另一组中有256条记录,每秒1条记录。有没有办法合并这些而不会丢失数据?我认为,插入或只是重复阻碍是必要的,但我宁愿不抛出任何数据。 我读了this post here,这与使用xts和动物园有关我的一个非常类似的问题有关。但它们每个都有很好的纪元日期/时间。我只有几秒钟!

sample data (A):
       time dist a_lat
1  139.4300   22     0
2  139.4325   22     0
3  139.4350   22     0
4  139.4375   22     0
5  139.4400   22     0
6  139.4425   22     0
7  139.4450   22     0
8  139.4475   22     0
9  139.4500   22     0
10 139.4525   22     0

sample data (B):
      timestamp  hex_acc_x  hex_acc_y hex_acc_z 
1  367065215501 -0.5546875 -0.7539062 0.1406250  
2  367065215505 -0.5468750 -0.7070312 0.2109375  
3  367065215509 -0.4218750 -0.6835938 0.1796875  
4  367065215513 -0.5937500 -0.7421875 0.1562500  
5  367065215517 -0.6757812 -0.7773438 0.2031250  
6  367065215521 -0.5937500 -0.8554688 0.2460938 
7  367065215525 -0.6132812 -0.8476562 0.2109375 
8  367065215529 -0.3945312 -0.8906250 0.2031250 
9  367065215533 -0.3203125 -0.8906250 0.2226562 
10 367065215537 -0.3867188 -0.9531250 0.2578125 

(哦,是的,顺便说一句,B数据集时间戳是纪元格式* 256,因为生活很艰难。我还没有为此转换它,因为数据集A没有这样的东西,只有0.0025个间隔。还有B数据传感器在数小时后保持开启状态,A数据传感器关闭,因此无效)

4 个答案:

答案 0 :(得分:2)

或者如果您愿意,可以使用apply

进行尝试
# using this sample data
df <- data.frame(from=c(1,4,7,11), to = c(3,6,10,13),rep=c(6,7,6,7));

> df
#  from to rep
#1    1  3   6
#2    4  6   7
#3    7 10   6
#4   11 13   7

unlist(apply(df, 1, function(x) rep(x['from']:x['to'], each=x['rep'])))    
# [1]  1  1  1  1  1  1  2  2  2  2  2  2  3  3  3  3  3  3  4  4  4  4  4  4  4
#[26]  5  5  5  5  5  5  5  6  6  6  6  6  6  6  7  7  7  7  7  7  8  8  8  8  8
#[51]  8  9  9  9  9  9  9 10 10 10 10 10 10 11 11 11 11 11 11 11 12 12 12 12 12
#[76] 12 12 13 13 13 13 13 13 13

答案 1 :(得分:1)

现在你就这么说了......我完全不知道你是如何计划使用所有6s和7s的。 : - )

无论如何,我建议标准化时间,添加“样本”列并合并它们。拥有“样本”列可能会在以后促进您的处理。

您的数据:

df400 <- structure(list(time = c(139.43, 139.4325, 139.435, 139.4375, 139.44, 139.4425,
                                 139.445, 139.4475, 139.45, 139.4525),
                        dist = c(22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L),
                        a_lat = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)),
                   .Names = c("time", "dist", "a_lat"),
                   class = "data.frame", row.names = c(NA, -10L))

df256 <- structure(list(timestamp = c(367065215501, 367065215505, 367065215509, 367065215513,
                                      367065215517, 367065215521, 367065215525, 367065215529, 
                                      367065215533, 367065215537),
                        hex_acc_x = c(-0.5546875, -0.546875, -0.421875, -0.59375, -0.6757812,
                                      -0.59375, -0.6132812, -0.3945312, -0.3203125, -0.3867188),
                        hex_acc_y = c(-0.7539062, -0.7070312, -0.6835938, -0.7421875,
                                      -0.7773438, -0.8554688, -0.8476562, -0.890625,
                                      -0.890625, -0.953125),
                        hex_acc_z = c(0.140625, 0.2109375, 0.1796875, 0.15625, 0.203125,
                                      0.2460938, 0.2109375, 0.203125, 0.2226562, 0.2578125)),
                   .Names = c("timestamp", "hex_acc_x", "hex_acc_y", "hex_acc_z"),
                   class = "data.frame", row.names = c(NA, -10L))

标准化您的时间范围:

colnames(df256)[1] <- 'time'
df400$time <- df400$time - df400$time[1]
df256$time <- (df256$time - df256$time[1]) / 256

指定标签以便于参考(而不是NA不够清晰):

df400 <- cbind(sample='A', df400, stringsAsFactors=FALSE)
df256 <- cbind(sample='B', df256, stringsAsFactors=FALSE)

现在进行合并和排序:

dat <- merge(df400, df256, by=c('sample', 'time'), all.x=TRUE, all.y=TRUE)
dat <- dat[order(dat$time),]
dat
##    sample     time dist a_lat  hex_acc_x  hex_acc_y hex_acc_z
## 1       A 0.000000   22     0         NA         NA        NA
## 11      B 0.000000   NA    NA -0.5546875 -0.7539062 0.1406250
## 2       A 0.002500   22     0         NA         NA        NA
## 3       A 0.005000   22     0         NA         NA        NA
## 4       A 0.007500   22     0         NA         NA        NA
## 5       A 0.010000   22     0         NA         NA        NA
## 6       A 0.012500   22     0         NA         NA        NA
## 7       A 0.015000   22     0         NA         NA        NA
## 12      B 0.015625   NA    NA -0.5468750 -0.7070312 0.2109375
## 8       A 0.017500   22     0         NA         NA        NA
## 9       A 0.020000   22     0         NA         NA        NA
## 10      A 0.022500   22     0         NA         NA        NA
## 13      B 0.031250   NA    NA -0.4218750 -0.6835938 0.1796875
## 14      B 0.046875   NA    NA -0.5937500 -0.7421875 0.1562500
## 15      B 0.062500   NA    NA -0.6757812 -0.7773438 0.2031250
## 16      B 0.078125   NA    NA -0.5937500 -0.8554688 0.2460938
## 17      B 0.093750   NA    NA -0.6132812 -0.8476562 0.2109375
## 18      B 0.109375   NA    NA -0.3945312 -0.8906250 0.2031250
## 19      B 0.125000   NA    NA -0.3203125 -0.8906250 0.2226562
## 20      B 0.140625   NA    NA -0.3867188 -0.9531250 0.2578125

我猜你的数据只是一个很小的代表。如果我猜得很差(A的整数是秒,B的整数是1/400秒)那么只是缩放。无论哪种方式,通过将第一个值重置为零然后合并/排序,它们很容易合并和排序。

答案 2 :(得分:0)

alt <- data.frame(len=c(42,22),rep=c(6,7));
alt;
##   len rep
## 1  42   6
## 2  22   7
altrep <- function(alt,cyc,len) {
    cyclen <- sum(alt$len*alt$rep);
    if (missing(cyc)) {
        if (missing(len)) {
            cyc <- 1;
            len <- cyc*cyclen;
        } else {
            cyc <- ceiling(len/cyclen);
        };
    } else if (missing(len)) {
        len <- cyc*cyclen;
    };
    if (isTRUE(all.equal(len,0))) return(integer());
    result <- rep(1:(cyc*sum(alt$len)),rep(rep(alt$rep,alt$len),cyc));
    length(result) <- len;
    result;
};
altrep(alt,2);
##   [1]   1   1   1   1   1   1   2   2   2   2   2   2   3   3   3   3   3   3   4   4   4   4   4   4   5   5   5   5   5   5   6   6   6   6   6   6   7   7   7   7   7   7   8   8   8   8   8   8   9   9   9
##  [52]   9   9   9  10  10  10  10  10  10  11  11  11  11  11  11  12  12  12  12  12  12  13  13  13  13  13  13  14  14  14  14  14  14  15  15  15  15  15  15  16  16  16  16  16  16  17  17  17  17  17  17
## [103]  18  18  18  18  18  18  19  19  19  19  19  19  20  20  20  20  20  20  21  21  21  21  21  21  22  22  22  22  22  22  23  23  23  23  23  23  24  24  24  24  24  24  25  25  25  25  25  25  26  26  26
## [154]  26  26  26  27  27  27  27  27  27  28  28  28  28  28  28  29  29  29  29  29  29  30  30  30  30  30  30  31  31  31  31  31  31  32  32  32  32  32  32  33  33  33  33  33  33  34  34  34  34  34  34
## [205]  35  35  35  35  35  35  36  36  36  36  36  36  37  37  37  37  37  37  38  38  38  38  38  38  39  39  39  39  39  39  40  40  40  40  40  40  41  41  41  41  41  41  42  42  42  42  42  42  43  43  43
## [256]  43  43  43  43  44  44  44  44  44  44  44  45  45  45  45  45  45  45  46  46  46  46  46  46  46  47  47  47  47  47  47  47  48  48  48  48  48  48  48  49  49  49  49  49  49  49  50  50  50  50  50
## [307]  50  50  51  51  51  51  51  51  51  52  52  52  52  52  52  52  53  53  53  53  53  53  53  54  54  54  54  54  54  54  55  55  55  55  55  55  55  56  56  56  56  56  56  56  57  57  57  57  57  57  57
## [358]  58  58  58  58  58  58  58  59  59  59  59  59  59  59  60  60  60  60  60  60  60  61  61  61  61  61  61  61  62  62  62  62  62  62  62  63  63  63  63  63  63  63  64  64  64  64  64  64  64  65  65
## [409]  65  65  65  65  66  66  66  66  66  66  67  67  67  67  67  67  68  68  68  68  68  68  69  69  69  69  69  69  70  70  70  70  70  70  71  71  71  71  71  71  72  72  72  72  72  72  73  73  73  73  73
## [460]  73  74  74  74  74  74  74  75  75  75  75  75  75  76  76  76  76  76  76  77  77  77  77  77  77  78  78  78  78  78  78  79  79  79  79  79  79  80  80  80  80  80  80  81  81  81  81  81  81  82  82
## [511]  82  82  82  82  83  83  83  83  83  83  84  84  84  84  84  84  85  85  85  85  85  85  86  86  86  86  86  86  87  87  87  87  87  87  88  88  88  88  88  88  89  89  89  89  89  89  90  90  90  90  90
## [562]  90  91  91  91  91  91  91  92  92  92  92  92  92  93  93  93  93  93  93  94  94  94  94  94  94  95  95  95  95  95  95  96  96  96  96  96  96  97  97  97  97  97  97  98  98  98  98  98  98  99  99
## [613]  99  99  99  99 100 100 100 100 100 100 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103 104 104 104 104 104 104 105 105 105 105 105 105 106 106 106 106 106 106 107 107 107 107 107
## [664] 107 107 108 108 108 108 108 108 108 109 109 109 109 109 109 109 110 110 110 110 110 110 110 111 111 111 111 111 111 111 112 112 112 112 112 112 112 113 113 113 113 113 113 113 114 114 114 114 114 114 114
## [715] 115 115 115 115 115 115 115 116 116 116 116 116 116 116 117 117 117 117 117 117 117 118 118 118 118 118 118 118 119 119 119 119 119 119 119 120 120 120 120 120 120 120 121 121 121 121 121 121 121 122 122
## [766] 122 122 122 122 122 123 123 123 123 123 123 123 124 124 124 124 124 124 124 125 125 125 125 125 125 125 126 126 126 126 126 126 126 127 127 127 127 127 127 127 128 128 128 128 128 128 128
altrep(alt,len=1000);
##   [1]   1   1   1   1   1   1   2   2   2   2   2   2   3   3   3   3   3   3   4   4   4   4   4   4   5   5   5   5   5   5   6   6   6   6   6   6   7   7   7   7   7   7   8   8   8   8   8   8   9   9   9
##  [52]   9   9   9  10  10  10  10  10  10  11  11  11  11  11  11  12  12  12  12  12  12  13  13  13  13  13  13  14  14  14  14  14  14  15  15  15  15  15  15  16  16  16  16  16  16  17  17  17  17  17  17
## [103]  18  18  18  18  18  18  19  19  19  19  19  19  20  20  20  20  20  20  21  21  21  21  21  21  22  22  22  22  22  22  23  23  23  23  23  23  24  24  24  24  24  24  25  25  25  25  25  25  26  26  26
## [154]  26  26  26  27  27  27  27  27  27  28  28  28  28  28  28  29  29  29  29  29  29  30  30  30  30  30  30  31  31  31  31  31  31  32  32  32  32  32  32  33  33  33  33  33  33  34  34  34  34  34  34
## [205]  35  35  35  35  35  35  36  36  36  36  36  36  37  37  37  37  37  37  38  38  38  38  38  38  39  39  39  39  39  39  40  40  40  40  40  40  41  41  41  41  41  41  42  42  42  42  42  42  43  43  43
## [256]  43  43  43  43  44  44  44  44  44  44  44  45  45  45  45  45  45  45  46  46  46  46  46  46  46  47  47  47  47  47  47  47  48  48  48  48  48  48  48  49  49  49  49  49  49  49  50  50  50  50  50
## [307]  50  50  51  51  51  51  51  51  51  52  52  52  52  52  52  52  53  53  53  53  53  53  53  54  54  54  54  54  54  54  55  55  55  55  55  55  55  56  56  56  56  56  56  56  57  57  57  57  57  57  57
## [358]  58  58  58  58  58  58  58  59  59  59  59  59  59  59  60  60  60  60  60  60  60  61  61  61  61  61  61  61  62  62  62  62  62  62  62  63  63  63  63  63  63  63  64  64  64  64  64  64  64  65  65
## [409]  65  65  65  65  66  66  66  66  66  66  67  67  67  67  67  67  68  68  68  68  68  68  69  69  69  69  69  69  70  70  70  70  70  70  71  71  71  71  71  71  72  72  72  72  72  72  73  73  73  73  73
## [460]  73  74  74  74  74  74  74  75  75  75  75  75  75  76  76  76  76  76  76  77  77  77  77  77  77  78  78  78  78  78  78  79  79  79  79  79  79  80  80  80  80  80  80  81  81  81  81  81  81  82  82
## [511]  82  82  82  82  83  83  83  83  83  83  84  84  84  84  84  84  85  85  85  85  85  85  86  86  86  86  86  86  87  87  87  87  87  87  88  88  88  88  88  88  89  89  89  89  89  89  90  90  90  90  90
## [562]  90  91  91  91  91  91  91  92  92  92  92  92  92  93  93  93  93  93  93  94  94  94  94  94  94  95  95  95  95  95  95  96  96  96  96  96  96  97  97  97  97  97  97  98  98  98  98  98  98  99  99
## [613]  99  99  99  99 100 100 100 100 100 100 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103 104 104 104 104 104 104 105 105 105 105 105 105 106 106 106 106 106 106 107 107 107 107 107
## [664] 107 107 108 108 108 108 108 108 108 109 109 109 109 109 109 109 110 110 110 110 110 110 110 111 111 111 111 111 111 111 112 112 112 112 112 112 112 113 113 113 113 113 113 113 114 114 114 114 114 114 114
## [715] 115 115 115 115 115 115 115 116 116 116 116 116 116 116 117 117 117 117 117 117 117 118 118 118 118 118 118 118 119 119 119 119 119 119 119 120 120 120 120 120 120 120 121 121 121 121 121 121 121 122 122
## [766] 122 122 122 122 122 123 123 123 123 123 123 123 124 124 124 124 124 124 124 125 125 125 125 125 125 125 126 126 126 126 126 126 126 127 127 127 127 127 127 127 128 128 128 128 128 128 128 129 129 129 129
## [817] 129 129 130 130 130 130 130 130 131 131 131 131 131 131 132 132 132 132 132 132 133 133 133 133 133 133 134 134 134 134 134 134 135 135 135 135 135 135 136 136 136 136 136 136 137 137 137 137 137 137 138
## [868] 138 138 138 138 138 139 139 139 139 139 139 140 140 140 140 140 140 141 141 141 141 141 141 142 142 142 142 142 142 143 143 143 143 143 143 144 144 144 144 144 144 145 145 145 145 145 145 146 146 146 146
## [919] 146 146 147 147 147 147 147 147 148 148 148 148 148 148 149 149 149 149 149 149 150 150 150 150 150 150 151 151 151 151 151 151 152 152 152 152 152 152 153 153 153 153 153 153 154 154 154 154 154 154 155
## [970] 155 155 155 155 155 156 156 156 156 156 156 157 157 157 157 157 157 158 158 158 158 158 158 159 159 159 159 159 159 160 160

您可以指定len=1.7e6(并省略cyc参数)以获得170万个元素,或者您可以使用cyc获得整数个周期。

答案 3 :(得分:0)

怎么样

len <- 2e6
step <- 400

x <- rep(64 * seq(0, ceiling(len / step) - 1), each = step) + 
        sort(rep(1:64, length.out = step))

x <- x[seq(len)] # to get rid of extra elements