2013-04-10 89 views
2

儘管標題相似,但這與Vectorizing rep and seq in R不一樣。矢量化seq的優雅方法?

我的近期目標:給定一個載體,我想生成包含舊值每個值之間的原始值加上定期間隔地一個新的載體。這並不困難。

一種策略是使用更一般的函數,給定兩個向量和指定的間隔,使用相同的by值重複將seq應用於兩個原始向量中的數字對。我還沒有找到這樣做的內置函數。 seq似乎對作爲參數處理向量有抵觸性。這裏是執行更一般的操作(這我就可以用我的燃眉之急)功能:

multiseq <- function(froms, tos, by){ 
    x <- c(); 
    for (i in seq_along(froms)){ 
    x <- c(x, seq(from=froms[i], to=tos[i], by=by)) 
    } 
    x 
} 

例如:

> multiseq(1:2, 1.75:2.75, .25) 
[1] 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 

(這只是一個簡單的例子,我真的想要的是具有任意序列做到這一點,如

-0.89115386 -0.75346155 -0.61576924 -0.47807693 -0.34038463 -0.20269232 -0.06500001 0.07269230 0.21038460 0.34807691 0.48576922 0.62346153 0.76115383 

我想每個區間的細分成五,創建具有5倍多元素的新序列。)

只要序列不太長,我相信反覆擴展載體不應該太慢。如果我需要大量序列,我可以重寫預擴展向量並填充它。但是,它仍然讓我完全用循環做到這一點。是否有更優雅的功能性編程R-ly方式?

謝謝。

+0

我沒有得到你想要的seq(1,2.75,by = .25)'做同樣的事情? – 2013-04-10 04:59:19

+0

謝謝@TylerRinker。我已編輯澄清。呃,但現在我想到了,你說得對。我只是沒有正確地考慮它。對於新的例子,我可以使用'seq(-0.89115386,0.76115383,0.176923/5)'。我也意識到我可以使用'c(mapply(seq,firstseq,secondseq,MoreArgs = list(by = 0.1376923/5))'。不確定是撤消還是回答 – Mars 2013-04-10 05:08:42

+0

回答並接受你的回答,它是完全有效的(雖然你將不得不等待幾天才能接受它),我只是想提出同樣的事情。'multiseq < - function(froms,tos,...)as.vector(mapply(seq ,froms,tos,...))',然後執行'multiseq(froms,tos,by = 0.1)'(說) – 2013-04-10 05:10:22

回答

1

嘗試以下

x <- c(1, 2, 4, 8) 
y <- unlist(mapply(FUN = function(from, to) { 
    seq(from = from, to = to, by = 0.25) 
}, head(x, -1), tail(x, -1))) 
y 
## [1] 1.00 1.25 1.50 1.75 2.00 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00 4.00 4.25 4.50 4.75 5.00 5.25 5.50 5.75 6.00 
## [24] 6.25 6.50 6.75 7.00 7.25 7.50 7.75 8.00 

result <- y[!duplicated(y)] 
result 
## [1] 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00 4.25 4.50 4.75 5.00 5.25 5.50 5.75 6.00 6.25 6.50 
## [24] 6.75 7.00 7.25 7.50 7.75 8.00 
7

在R,的向量化的函數的最簡單的方法之一是使用Vectorize功能。

基本上,你可以矢量化fromto參數,並把所有的起動器在from參數向量和做同樣的事情爲to說法。

使用你的榜樣,你可以這樣做

seq2 <- Vectorize(seq.default, vectorize.args = c("from", "to")) 

c(seq2(from = c(1, 1.75), to = c(2, 2.75), by = 0.25)) 

## [1] 1.00 1.25 1.50 1.75 2.00 1.75 2.00 2.25 2.50 2.75 
+0

+ 1並刪除我的一半書面答覆。在原始問題中'not duplicate' – mnel 2013-04-10 05:33:19

+0

@mnel,也許它應該在那裏發佈,但是這個問題比標題暗示的更具體 – Mars 2013-04-10 16:07:37

+0

謝謝dickoa我曾嘗試過'seq'使用'Vectorize',它會產生一個錯誤什麼是'seq.default'?什麼時候這些函數存在的一般規則,以及它們是什麼?一個指針到一個好的來源(或甚至一個適當的搜索字符串),將不勝感激。 – Mars 2013-04-10 16:11:20

0

東西作爲@TylerRinker在我的問題上意見建議,對我的特殊需要有一個解決方案,這比什麼我的問題的提出建議的簡單 - 我太專注於特定的思考方式。由於我希望在已經有規律間隔的數字之間插入規則間隔的數字,因此我可以將seq應用於向量中的初始值和終止值,並使用by值,該值均勻劃分爲原始向量中值之間的間隔:

subdiv <- function(x, by) seq(x[1], x[length(x)], by) 
subdiv(1:4, .25) 
[1] 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00 
subdiv(c(-0.20269232, -0.06500001, 0.07269230), 0.1376923/3) 
[1] -0.20269232 -0.15679489 -0.11089745 -0.06500002 -0.01910259 0.02679485 0.07269228 

其中0.1376923是在第二應用連續元素之間的差異。只要我不需要從原始矢量繼承的元素完全等於它們的原始值,這種解決方案就可以了 - 正如您所看到的,由於浮點算術而存在一些差異。 (我實際上在做的是構造直方圖的容器;精確的邊界不會影響。)

@ dickoa's和@ geektrader的答案有更廣泛的用途,並且保留了輸入向量中原始數字的確切值。