在没有循环的情况下复制R中的值

时间:2016-03-06 05:01:16

标签: r

我有两个向量。第一个是我的数据(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。

没有循环,有没有一种简单的方法可以做到这一点?

2 个答案:

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

行程编码函数rleinverse.rle可能对此类数据很有用。借用R. Schifini的答案,你可以用

创建一个rle对象

x = list( values=b, lengths=d ) class(x) = "rle" inverse.rle(x)

此外,Bioconductor的S4Vectors::Rle类存储此类数据并允许所有向量操作,同时将数据保持为此压缩形式。