R - 重复 cbind 一个矩阵和一个不等长的向量 - >向量进入新列并且不覆盖前一列的空单元格

R - repeatedly cbind a matrix & a vector of unequal length -> vector goes into new column and not overwrite empty cells of previous columns

我需要重复将向量添加到矩阵。每次我这样做时,两者的长度都不一样。然后将完整的矩阵用于进一步分析(绘图、t 检验)三个月前这段代码有效:

    mlen <- max(length(matrix), length(vector))
    length(maxtrix) <- length(vector) <- mlen
    matrix <- cbind(matrix, vector)

我没有为此使用任何特定的软件包。数据输入未更改为 csv 文件。现在我有以下任一问题:

a) 不等长函数不再正常工作。 IE。如果新向量有 970 'rows' 但现有矩阵中最长的列只有 270 行,那么添加向量的剩余 500 行将被截断。 警告消息是 In function (..., deparse.level = 1) : number of rows of result is not a multiple of vector length (arg 2) 这并不总是发生。

b) 添加的向量的值被放置在矩阵中现有列底部的空单元格中。

两者都严重破坏了我的进一步分析。我已尝试按照建议 here、合并或追加使用 do.call(cbind...)。没有任何东西产生我需要的输出,这是一个矩阵,每个向量有 1 列,没有任何数据丢失或混合。

谢谢!

更新: 以上代码行是执行以下操作的代码的一部分:数据导入(大小不同)- 数据清理(数据大小变化更大)-将数据存储在矩阵或数据框中 - 计算每列的平均值,绘图/t 检验数据

除非可以保留原始数据结构,否则将列表中的所有内容都扔到列表中并创建矩阵对我来说没有用。

可能更简单的解决方案如下:

  1. 将所有向量存储在一个列表中,而不是一个一个地附加它们
  2. 使它们的长度相同,用 NA
  3. 填充缺失的项目
  4. cbind一切都成矩阵

模拟示例:

library(dplyr)

ll <- list(c(1,2,3,4,5), c(2,3), c(5,6,7,8,12,13,14,15))
ll

lapply(ll, function(x) x[1: max(sapply(ll, length))]) %>% do.call(cbind, .) 

输出为:

    [,1] [,2] [,3]
[1,]    1    2    5
[2,]    2    3    6
[3,]    3   NA    7
[4,]    4   NA    8
[5,]    5   NA   12
[6,]   NA   NA   13
[7,]   NA   NA   14
[8,]   NA   NA   15

实施了 Tyler 的解决方案 here。为了完成目的,这里又是代码:

   cbind.fill <- function(...){
     nm <- list(...) 
     nm <- lapply(nm, as.matrix)
     n <- max(sapply(nm, nrow)) 
     do.call(cbind, lapply(nm, function (x) 
     rbind(x, matrix(, n-nrow(x), ncol(x))))) 
    }
   matrix <- cbind.fill(matrix, vector)

使用 nrow 导致新数据被写入先前列的 NA 单元格而不是新列。对于所有对 difference between nrow and length

感兴趣的人