2016-03-06 92 views
2

我有两个向量。首先是我的数据(b)。第二个是数据重复(a)在该范围内的索引范围。在没有循环的情况下在R中复制值

> 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.

是否有一种简单的方法可以在没有循环的情况下执行此操作?

回答

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) 

与差异得到你想要多少次重复每一个元素,但你失去了你要多少次重复第一,所以添加的第一个元素。
一旦这样做,你需要使用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 
> 
+0

谢谢!我很感激! – jessica

1

行程长度编码功能rleinverse.rle将可能是对这种有用的数据。从R. Schifini的答案借用你可以同时保持在这个压缩后数据用

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

而且创建一个RLE对象,Bioconductor的的S4Vectors::Rle类存储这种类型的数据,并允许所有的向量操作。

+0

谢谢!我很感激! – jessica

相关问题