2016-03-29 22 views
0

varsayalım böyle bir vektör vardır:R vektörü operasyon, desen arasındaki insert değeri

[1] 0 1 0 0 0 0 0 -1 0 1 0 0 -1 0 0 1 -1 

Ve böyle bu vektör açmak istiyorum:

[1] 0 100 100 100 100 100 100 100 0 101 101 101 101 0 0 102 102 

sadece arasında bir değer eklemek [1, -1] ve indeks ile artar.

Bunu döngü kullanmadan nasıl alabilirim?

a = c(0,1,0,0,0,0,0,-1,0,1,0,0,-1,0,0,1,-1) 

cevap

2

bu deneyin: umarım bu işe düşünüyorum

(cumsum(a==1)+99)* 
    `[<-`(numeric(length(a)),unlist(Map(`:`,which(a==1),which(a==-1))),1) 
#[1] 0 100 100 100 100 100 100 100 0 101 101 101 101 0 0 102 102 
+0

Merhaba, nicola, Harika! Ama bütün bunları anlayamıyorum, kodunuzun ikinci kısmı hakkında daha fazla bilgi verebilir misiniz, bu nedir? * '[<-' (sayısal (uzunluk (a)), liste dışı (Harita (': ', hangi (a == 1), hangi (a == - 1))), 1) 'anlam? – jjdblast

+1

çift temel olarak – baptiste

+1

zanaat, 'sayısal (uzunluk (a))' 0'ların bir vektörünü oluşturur; 'Harita (": "), bu konumlarda 1'ler atamak için kullanılan ardışık indekslerin tüm sıralarını oluşturur (' [<- (x, i, 1) '' x [i] <- 1'). Ve elde edilen boolean vektör '(cumsum (a == 1) +99)' yoluyla elde edilen 99-102 yeni değerleri filtrelemek için kullanılır. – baptiste

2

Biz değerleri çoğaltmak, vector 1 ve -1 değerlerin pozisyonlar elde etmek which kullanabilir 100: 102 göre

orijinal veri kümesi

şu kod ile üretilebilir matrix oluşturmak için Map, rbind kullanarak pozisyonlar arasındaki karşılık gelen uzunluk. ve 'm1' deki ilk sütun konumuna karşılık gelen 'a' pozisyonlarını, 'm1' ikinci sütununa göre değiştirin.

m1 <- do.call(rbind,Map(function(x,y,z) 
     cbind(x:y,rep(z, y-x+1)), which(a==1), which(a==-1), 100:102)) 
a[m1[,1]] <- m1[,2] 
a 
#[1] 0 100 100 100 100 100 100 100 0 101 101 101 101 0 0 102 102 
+1

sayesinde, bir sürü insan bana yardım et! açıklamanız gerçekten açık! – jjdblast

2

, akrun

tmp <- rle(cumsum(a) | a) 
tmp$values[tmp$values] <- 99 + cumsum(tmp$values[tmp$values]) 
inverse.rle(tmp) 
# [1] 0 100 100 100 100 100 100 100 0 101 101 101 101 0 0 102 102 
+0

Teşekkürler vaftiz, yöntemini denedim, işe yaradı! Ama hala yardım belgelerini okuduktan sonra ne yaptığımı anlayamıyorum, daha fazlasını açıklayabilir misiniz? – jjdblast

+0

rle(), değerler listesini ve değiştikleri dizinleri depolayarak aynı olan ardışık değerleri kodlar. Burada, vektörü ters işlemle yeniden genişletmeden önce bu değerleri basitçe yapıyorum. – baptiste

+0

Açıklamanız için tekrar teşekkürler, baptiste! Gerçekten temiz bir kod :) – jjdblast