2012-10-04 26 views
0

問題:
使用R,我有兩個陣列,都具有相同類型的數據(例如相同的行,列和/或層名稱)。但是,它們有不同的尺寸。行的&列名稱部分重疊。也就是說,大多數的行和列因子級別都出現在兩個數組中,但有些對每個數組都是唯一的。我想要使​​用這些數組中的一個,並對其進行細化,使其僅包含兩個數組共有的行級別&列級別。我之前可以通過編寫自己非常複雜的函數來實現這一點,但似乎這確實應該是一個簡單的操作。任何人都可以爲我指出正確的方向嗎?削減部分重疊信息的陣列

下面是我認爲這是一個不必要的費力的方式來完成這一點的一些示例代碼。在這種情況下,sp.ixn.core是一個更小的2D數組,我想削減一個3D數組,以便行和列匹配sp.ixn.core ...最後一點是我仔細檢查數字正確添加。

temp=table(data$plant,data$Species,data$jdate) 
temp2=array(,dim=c(nrow(sp.ixn.core),ncol(temp),dim(temp)[3])) 

for (i in 1:length(rownames(sp.ixn.core))){ 
temp2[i,,] = temp[rownames(temp) == rownames(sp.ixn.core)[i],,] 
} 

colnames(temp2) = colnames(temp) 
temp3=array(,dim=c(nrow(sp.ixn.core),ncol(sp.ixn.core),dim(temp)[3])) 
for (i in 1:length(colnames(sp.ixn.core))){ 
temp3[,i,] = temp2[,colnames(temp2) == colnames(sp.ixn.core)[i],] 
} 
dim(temp3) 

sp.ixn.core.tbl = temp3 
dimnames(sp.ixn.core.tbl)[[3]] = dimnames(temp)[[3]] 
dimnames(sp.ixn.core.tbl)[[2]] = colnames(sp.ixn.core) 
dimnames(sp.ixn.core.tbl)[[1]] = rownames(sp.ixn.core) 
dimnames(sp.ixn.core.tbl) 

for (i in 1:nrow(sp.ixn.core)){ 
    if (sum(sp.ixn.core.tbl[i,,]) == rowSums(sp.ixn.core)[i]) 
     print("yes") 
} 

for (i in 1:ncol(sp.ixn.core)){ 
    if (sum(sp.ixn.core.tbl[,i,]) == colSums(sp.ixn.core)[i]) 
     print("yes") 
} 
+2

您能告訴我們一些示例代碼嗎? – sgibb

+0

除了代碼之外,我們還提供'dput(sp.ixn.core)'我們可以剪切並粘貼到瀏覽器中。 – nograpes

+0

您的代碼無法運行。你可以讓你的例子可重現嗎? http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

回答

0

我想你可能只需要:

newtemp <- temp[ rownames(temp) %in% rownames(sp.ixn.core), 
       colnames(temp) %in% colnames(sp.ixn.core), 
       dimnames(temp)[3] %in% dimnames(sp.ixn.core)[3] ] 

而且你可以只用 'dimnames',因爲dimnames(X)[1] == rownames(X)。正如nograpes所建議的,最好是對照實際的數據對象進行測試。我有點擔心你的表調用可能返回一個帶有NULL dimnames的對象。