如何在R中按名称将向量转换为矩阵?

4
我有这个向量。
   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")

我会将其转换为一个4x4维度的矩阵:
ID        var1     var2    var3
"1000"     NA       "1"     NA
"1001"     "1"      "1"     NA
"1002"     NA       "7"     NA
"1003"     NA       NA     "3"  

你能帮我吗?

这是需要翻译的内容,涉及到IT技术。
2个回答

3
我们可以根据“ID”的出现将向量“x”拆分为分组向量,使用列表元素的名称将唯一名称('nm1')与名称进行match,然后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" 

或者在创建空矩阵后使用行/列索引。

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

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接