2015-01-01 37 views
0

比方說,我有矩陣A:如何根據行名稱組合不同的文章?

rows.names Value 
---------------- 
man   NA 
woman  NA 
girl  NA 
boy   NA 
cat   NA 
dog   NA 

和一些矩陣(B,C,d等),如下所示:

rows.names V1 
-------------- 
woman  3 
dog   5 


rows.names V2 
-------------- 
man   4 
woman  7 
cat   6 

rows.names V3 
--------------- 
boy   17 
cat   10 
dog   1 

而且我想根據這4加入到行.names(用NAs替換丟失的數據):

row.names Value V1 V2 V3 
-------------------------------- 
man   NA  NA 4 NA 
woman  NA  3 7 NA 
girl  NA  NA NA NA 
boy   NA  NA NA 17 
cat   NA  NA 6 10 
dog   NA  5 NA 1 

這怎麼辦?謝謝。

回答

3

你的標題說,「矩陣」,但你的問題被標記data.frame,所以這裏的做法假設你正在處理data.frame S:

df1 <- data.frame(rn = c("man", "woman", "girl", "boy", "cat", "dog"), 
        Value = NA) 
df2 <- data.frame(rn = c("woman", "dog"), V1 = c(3, 5)) 
df3 <- data.frame(rn = c("man", "woman", "cat"), V2 = c(4, 7, 6)) 
df4 <- data.frame(rn = c("boy", "cat", "dog"), V3 = c(17, 10, 1)) 

library(reshape2) 
dcast(melt(mget(ls(pattern = "df\\d")), id.vars = "rn"), 
     rn ~ variable, value.var = "value") 
#  rn Value V1 V2 V3 
# 1 boy NA NA NA 17 
# 2 cat NA NA 6 10 
# 3 dog NA 5 NA 1 
# 4 girl NA NA NA NA 
# 5 man NA NA 4 NA 
# 6 woman NA 3 7 NA 

的總體思路是使用mget捕獲所有的list中的相關對象(當然,您也可以手動執行此操作)。然後,使用list方法melt將所有內容組合爲「長」data.frame。這可以很容易地使用dcast重塑。


的方法是相似的(甚至更容易),如果你有矩陣:

m1 <- `rownames<-`(as.matrix(df1[-1]), df1[[1]]) 
m2 <- `rownames<-`(as.matrix(df2[-1]), df2[[1]]) 
m3 <- `rownames<-`(as.matrix(df3[-1]), df3[[1]]) 
m4 <- `rownames<-`(as.matrix(df4[-1]), df4[[1]]) 

dcast(melt(mget(ls(pattern = "m\\d"))), Var1 ~ Var2, value.var = "value") 
# Var1 Value V1 V2 V3 
# 1 man NA NA 4 NA 
# 2 woman NA 3 7 NA 
# 3 girl NA NA NA NA 
# 4 boy NA NA NA 17 
# 5 cat NA NA 6 10 
# 6 dog NA 5 NA 1 
+0

謝謝!我甚至似乎理解它:)。 –

2

看起來這會工作。只需將行名稱與Value矩陣匹配,然後替換爲一個子集。 vapply將把它簡化爲矩陣,我們可以用cbind與主矩陣。

mlist <- list(m2, m3, m4) 

newPart <- vapply(mlist, function(x) { 
     x[match(rownames(m1), rownames(x))] 
    }, numeric(nrow(m1))) 

cbind(m1, provideDimnames(newPart)) 
#  Value A B C 
# man  NA NA 4 NA 
# woman NA 3 7 NA 
# girl  NA NA NA NA 
# boy  NA NA NA 17 
# cat  NA NA 6 10 
# dog  NA 5 NA 1 
+0

我在考慮'匹配',但不清楚第一個矩陣是否必須包含所有的rownames。所以,我想我會走更可預測的路線。 (+1) – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto - 另一個很好的技巧,我很容易創建'NA'就是'replace'。你可以用一個以上的東西來替換一個NA,並且NAs填補空缺。 '替換(NA,c(2,5,6,9,10),LETTERS [1:5])' –

+0

唯一的缺點是可能沒有達到理想的長度 –

相關問題