【问题标题】:How to put vectors with different length together to one matrix如何将不同长度的向量放在一个矩阵中
【发布时间】:2015-04-18 14:21:04
【问题描述】:

我有一个这样的数据框:

    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 的数量。

【问题讨论】:

  • 我无法重现这个。我没有看到这个“num”对象。看起来您只有一个尚未在循环/*应用中的操作(因此可推广到更多向量)。像mylist &lt;- lapply(unique(df$ids),function(i)subset(num,id==i)) 这样的东西可能适用于此。顺便说一句,您可能不想将您的列表命名为“列表”。

标签: r matrix vector distance variable-length


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    使用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))
    

    【讨论】:

      【解决方案3】:

      您可以使用reshape2 包中的dcast 函数。

          library(reshape2)
      
          x <- dcast(num, id ~ class)
      
          mat <- as.matrix(x[,-1])
      

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

      【讨论】:

        猜你喜欢
        • 2017-12-13
        • 1970-01-01
        • 2021-02-27
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多