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 检验数据
除非可以保留原始数据结构,否则将列表中的所有内容都扔到列表中并创建矩阵对我来说没有用。
可能更简单的解决方案如下:
- 将所有向量存储在一个列表中,而不是一个一个地附加它们
- 使它们的长度相同,用 NA
填充缺失的项目
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
感兴趣的人
我需要重复将向量添加到矩阵。每次我这样做时,两者的长度都不一样。然后将完整的矩阵用于进一步分析(绘图、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 检验数据
除非可以保留原始数据结构,否则将列表中的所有内容都扔到列表中并创建矩阵对我来说没有用。
可能更简单的解决方案如下:
- 将所有向量存储在一个列表中,而不是一个一个地附加它们
- 使它们的长度相同,用 NA 填充缺失的项目
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
感兴趣的人