2015-06-06 36 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