2015-06-06 42 views
4

我有這個載體如何通過R中的名稱將矢量轉換爲矩陣?

ID var2  ID var2 var1  ID var2  ID var3 
"1000" "1" "1001" "1" "1" "1002" "7" "1003" "3" 

可以從

x=c("1000","1","1001","1","1","1002","7","1003","3") 
names(x)=c("ID","var2","ID","var2","var1","ID","var2","ID","var3") 

獲得,我會把它轉換成該矩陣尺寸爲4×4:

ID  var1  var2 var3 
"1000"  NA  "1"  NA 
"1001"  "1"  "1"  NA 
"1002"  NA  "7"  NA 
"1003"  NA  NA  "3" 

你能幫助我嗎?

回答

2

既不漂亮或快,但你可以使用data.table::rbindlist

library(data.table) 
# Create list of lists splitting data by ID and convert to data.table 
dt <- rbindlist(tapply(x, cumsum(names(x) == "ID"), as.list), fill=TRUE) 
# Ensure column order 
setcolorder(dt, c('ID', 'var1', 'var2', 'var3')) 
# Convert to matrix 
as.matrix(dt) 
+0

好的,非常感謝 –

3

我們可以split向量「X」由一個分組向量基於與列表元素order的名字「ID」,match獨特的名字(「NM1」)的發生,然後rbind獲得預期輸出

nm1 <- sort(unique(names(x))) 
do.call(rbind,lapply(split(x, cumsum(grepl('ID', names(x)))), function(y) 
     setNames(y[match(nm1, names(y))], nm1) 
     )) 
# ID  var1 var2 var3 
#1 "1000" NA "1" NA 
#2 "1001" "1" "1" NA 
#3 "1002" NA "7" NA 
#4 "1003" NA NA "3" 

或者在創建空矩陣後使用row/col索引。

indx <- match(names(x), nm1) 
m1 <- matrix(, nrow= max(tabulate(indx)), ncol=length(nm1), 
      dimnames=list(NULL, nm1)) 
m1[cbind(cumsum(indx==1), indx)] <- x 
+0

它工作得很好,非常感謝 –

+0

@CinziaViroli很高興知道,它的工作原理做這樣的事情。請通過點擊投票旁邊的勾號來考慮接受最佳解決方案。有關指南,請http://stackoverflow.com/help/accepted-answer – akrun