如何将不同长度的向量放在一个矩阵中

时间:2015-02-17 19:02:08

标签: r matrix vector distance variable-length

我有一个这样的数据框:

    id                 class  
   146                H02J
   146                F03D
   146                F03D
   287                F16F
   287                F16F
  1040                F03D
  1040                F16D
  1040                F03D
  1042                F03D
  1042                G01W
  1042                F03D
  1042                F03D
  1042                F03D
  1816                G06F
  1816                H04Q
  1816                H04L
  1816                H04W

现在我想构建具有数值的向量,每个向量代表一个应用程序,每个数值代表class

由于矢量的长度不同,我无法使用矢量定义矩阵,具有我的R技能,我很感谢能够解决这个问题的想法。

输出应该是这样的矩阵,目标是确定矢量之间的距离。

> mat
     [,1] [,2] [,3] [,4] [,5]
[1,]    6    1    1   NA   NA
[2,]    3    3   NA   NA   NA
[3,]    1    2    1   NA   NA
[4,]    1    4    1    1    1
[5,]    5    8    7    9   NA

我得到了这个:

v1 <- subset(num, id==146)
v2 <- subset(num, id==287)
v3 <- subset(num, id==1040)
v4 <- subset(num, id==1042)
v5 <- subset(num, id==1816)

list <- list(c(v1), c(v2), c(v3), c(v4), c(v5))
list
max.length <- max(sapply(list, length))
list <- lapply(list, function(x) { c(x, rep(NA, max.length-length(x)))})
do.call(rbind, list)
mat <- do.call(rbind, list)

但解决方案不仅适用于这五个示例,而且适用于大量id个(向量),而不是手动设置id的数量。

3 个答案:

答案 0 :(得分:3)

您可以使用rbind.fill.matrix包中的plyr

library(plyr)
do.call(rbind.fill.matrix,  tapply(as.integer(num$class), num$id, t))

结果:

     1 2  3  4  5
[1,] 6 1  1 NA NA
[2,] 3 3 NA NA NA
[3,] 1 2  1 NA NA
[4,] 1 4  1  1  1
[5,] 5 8  7  9 NA

答案 1 :(得分:1)

使用dplyrtidyr个包,您可以执行以下操作:

library(dplyr)
library(tidyr)

d %>% 
  group_by(id) %>% 
  mutate(i=1:n(),value=as.integer(class),class=NULL) %>% 
  spread(i,value)

#     id 1 2  3  4  5
# 1  146 6 1  1 NA NA
# 2  287 3 3 NA NA NA
# 3 1040 1 2  1 NA NA
# 4 1042 1 4  1  1  1
# 5 1816 5 8  7  9 NA

其中d是样本数据集:

d <- structure(list(id = c(146L, 146L, 146L, 287L, 287L, 1040L, 1040L, 
1040L, 1042L, 1042L, 1042L, 1042L, 1042L, 1816L, 1816L, 1816L, 
1816L), class = structure(c(6L, 1L, 1L, 3L, 3L, 1L, 2L, 1L, 1L, 
4L, 1L, 1L, 1L, 5L, 8L, 7L, 9L), .Label = c("F03D", "F16D", "F16F", 
"G01W", "G06F", "H02J", "H04L", "H04Q", "H04W"), class = "factor")), .Names = c("id", 
"class"), class = "data.frame", row.names = c(NA, -17L))

答案 2 :(得分:0)

您可以使用dcast包中的reshape2功能。

    library(reshape2)

    x <- dcast(num, id ~ class)

    mat <- as.matrix(x[,-1])

您应该注意,此矩阵的列名是您在类列中找到的值。另外,NA表示为0,它们更适合于计算距离。