2013-07-12 30 views
0

儘管與幾個人討論過,但我還沒有能夠解決我的問題,因此希望這裏的社區能夠提供幫助。如何在列表中的行上應用函數

數據存儲爲數組列表。列表中的每個組件都表示按特定因素分組的數據。該陣列有三個維度。第一維表示時間,第二維表示成分的數量,第三維表示數據點。因此,在每個組成部分(第二維)下面的示例數據中,每個時間單位(第一維)具有三個數據點(第三維)。

第一維和第三維有固定的nrow(時間)和ncol(數據點),而第二維隨每個組(列表中的組件)而變化,這是我爲什麼將數組存儲在列表中。

所以數據結構如下。

data.list <- vector("list", 3) 

numb <- c(2,3,4) 

data.list[[1]] <- array(1:(numb[1] * 5 * 3), dim = c(5, numb[1], 3)) 
data.list[[2]] <- array(1:(numb[2] * 5 * 3), dim = c(5, numb[2], 3)) 
data.list[[3]] <- array(1:(numb[3] * 5 * 3), dim = c(5, numb[3], 3)) 

如果我想隨着時間的推移計算平均值爲1組所有成分的第一個數據點(假定它沒有存儲在一個列表),我只想做:

apply(array[,, "data.point.1"], 1, mean) 

現在我想在所有組(列表中的組件)和跨組件(數組中的第二維)上應用平均值(行),但我找不到解決方案。

我試圖使用sapply,因爲基本上我想要得到一個向量作爲輸出,其長度對應於數組的nrow(基本上是此問題中的時間段數)。然而,sapply會在每個組件上應用一個函數,並返回一個具有列表長度的向量(至少這是發生在我身上的事情)。

任何人都可以看到這個問題的一個很好的解決方案嗎?

如果不是,那麼根本問題是,數據可能存儲在我想要做的計算類型的錯誤方式?

+0

嗯,是啊這是一個有點混亂沒有樣品預期的輸出。我想OP是這樣的:'lapply(data.list,function(x)apply(x,3,rowMeans))''。 – nograpes

+0

nograpes您的解決方案几乎是正確的。但是,你說得對,這有點令人困惑。我編輯了這個問題來簡化數據結構和「更簡單」的數字。對於所有組分(數組中的第二維),在第一個數據點(第三維中的列)上,第一個數據點的平均值應爲121.該函數應基本上返回一個長度向量100對應於時間段。 –

+0

沿着nograpes的想法這個:sapply(data.list,function(x)apply(x [,, 1],1,mean))給出每個組件的每個時間單位的平均值 - 基本上是一個100×5的矩陣。如何在一行代碼中將這個值降低到上述矩陣的每行平均值的100 x 1矢量 - 不存儲矩陣,然後在矩陣上使用apply創建多行代碼? –

回答

0

我還是不明白,OP,但是這將在意見概括和簡化輕微的公式:

rowMeans(do.call(cbind, lapply(data.list, function(x) x[,,1]))) 
相關問題