2013-07-23 27 views
3

這裏是一個簡單的r問題,它基本上與正確理解我認爲的列表語法有關。我有一系列的矩陣加載到一個列表中(接下來的一些初步計算),然後我想要進行一些基本的塊平均。我的基本工作流程如下:將列表中的每個元素填充到R中的特定長度

1)將包含在列表中的每個向量四捨五入爲整數,對應於我對平均值感興趣的塊數。

2)將列表中的每個向量填充到這個新的長度。

3)將列表中的每個矩陣轉換爲一個新的矩陣,然後我將應用colmeans忽略NA。

這很基本的工作流程如下這裏顯示的矢量簡單的方法:http://www.cookbook-r.com/Manipulating_data/Averaging_a_sequence_in_blocks/

但是我有載體列表,而不是隻是一個載體。例如對於兩個塊:

test1 <- list(a=c(1,2,3,4), b=c(2,4,6,8,10), c=c(3,6)) 
# Round up the length of vector the to the nearest 2 
newlength <- lapply(test1, function(x) {ceiling(length(x)/2)*2}) 

現在我的問題。如果這些人名單外基質我通常會墊其長度爲NAS如下:

test1[newlength] <- NA 

但如何做到這一點使用lappy上(或東西akin- mapply?)。我顯然不是思考語法正確位置:

lapply(test1, function(x) {x[newlength] <- NA}) 

這顯然將返回錯誤:

Error in x[newlength] <- NA : invalid subscript type 'list' 

因爲對列表中的語法不正確。那麼我應該如何正確地做到這一點?

剛剛完成的過程中情況下在最後我通常會做以下矢量這樣做的完全更好的辦法:

# Convert to a matrix with 2 rows 
test1 <- matrix(test1, nrow=2) 
# Take the means of the columns, and ignore any NA's 
colMeans(test1, na.rm=TRUE) 

我會更好先留下一個列表環境?我列出的原因是我有一個大的數據集,使用列表似乎是一個更優雅的方法。然而,我接受建議和更合理的方法。謝謝。

+3

填充的一個更安全的方法是'長度(X) < - newlength'。 – Roland

回答

2

有很多方法可以解決您的問題,但我認爲有兩個重要的改進。首先是在lapply()的單個調用中完成所有這些。您遇到的另一個主要問題是您的調用中函數()中沒有返回錯誤的實際return()值(對不起,在平板電腦上難以複製和粘貼)。所以,你填寫「x」好,但你告訴function()返回什麼?沒有。

這裏是一個解決方案,它這兩個東西,如果我理解正確:

lapply(test1, function(x){ 
    newlength <- ceiling(length(x)/2)*2 
    if(newlength!=length(x)){x[newlength] <- NA} 
    colMeans(matrix(x, nrow=2), na.rm=TRUE) 
}) 
+0

嗨,彼得,這基本上是謝謝,但給我的例子我注意到奇怪的行爲,當個別向量已經是我想要平均的整數倍數。例如,在這個例子中,使用test1和塊平均值超過2,for test1 $ a(它是c(1,2,3,4))的結果是1.5和3。0我希望我的輸出是(3 + 4)/ 2 = 3.5。 – user1912925

+0

好的,我錯過了一點 - 如果它不是偶數個元素,你只想填補NA。我用大錘固定了它(見上)。但可能有更優雅的解決方案。 –

+0

優雅與否你已經回答我的問題,所以謝謝。 – user1912925

4

這聽起來像你想:

mapply(function(x,y) { 
    # x[y] <- NA # OP's proposed strategy 
    length(x) <- y # Roland's better suggestion 
    return(x) 
    }, test1, newlength) 
相關問題