我有两个向量。第一个是我的数据(b)。第二个是索引范围,数据在该范围内重复(a)。
> b
[1] 213488 204506 246738 298035 370680 377635 404552 477359 310586 383221 486429 482295 438255 411939 268882
> a
[1] 214 466 718 968 1221 1473 1724 1977 2228 2479 2732 2983 3235 3487 3738
我希望b矢量(213488)中的第一个元素从1到214重复,然后b矢量(204506)中的第二个元素从215-466重复,依此类推。 b向量中的最后一个元素(268882)将从3738变为5000。
没有循环,有没有一种简单的方法可以做到这一点?
答案 0 :(得分:6)
这样做:
b = c(213488,204506, 246738, 298035, 370680, 377635, 404552, 477359, 310586, 383221, 486429, 482295, 438255, 411939, 268882)
a = c(214, 466, 718, 968, 1221, 1473, 1724, 1977, 2228, 2479, 2732, 2983, 3235, 3487, 3738)
c = diff(a)
d = c(a[1],c)
rep(b,d)
使用diff你可以得到你想要重复每个元素的次数,但是你想要重复第一个元素的次数,所以添加a的第一个元素。
完成后,您需要使用rep()
示例强>
b = c(1,2,3,4)
a = c(3,8,10,15)
c = diff(a)
d = c(a[1],c)
rep(b,d)
[1] 1 1 1 2 2 2 2 2 3 3 4 4 4 4 4
>
答案 1 :(得分:2)
行程编码函数rle
和inverse.rle
可能对此类数据很有用。借用R. Schifini的答案,你可以用
x = list( values=b, lengths=d )
class(x) = "rle"
inverse.rle(x)
此外,Bioconductor的S4Vectors::Rle
类存储此类数据并允许所有向量操作,同时将数据保持为此压缩形式。