R 在列表中对不同维度的矩阵求和并返回一个矩阵
这可能很容易,但我似乎不明白。 我有一个由矩阵组成的列表:R 在列表中对不同维度的矩阵求和并返回一个矩阵,r,R,这可能很容易,但我似乎不明白。 我有一个由矩阵组成的列表: randomString <- function(n = 5000) { a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE)) paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE)) } mat_names <- randomStri
randomString <- function(n = 5000) {
a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}
mat_names <- randomString(10)
mat1 <- matrix(sample(1:100, 10), nrow = 1, ncol = 10)
colnames(mat1) <- mat_names[1:10]
mat2 <- matrix(sample(1:100, 7), nrow = 1, ncol = 7)
colnames(mat2) <- mat_names[1:7]
mat3 <- matrix(sample(1:100, 3), nrow = 1, ncol = 3)
colnames(mat3) <- mat_names[1:3]
matlist <- list(
"mat1"=mat1,
"mat2"=mat2,
"mat3"=mat3
)
print(matlist)
现在,我需要基于列名称的列的总和,这样一个矩阵:
YDBTT5207K DJTTX5635J XADWJ8211U SPPLC7331C DKSHW5279Z VSTXA0199O RELXP9721L SQQFH3616Q JFZFB3125N NWKCT9607I
[1,] 234 205 146 138 153 138 111 15 63 55
allelem = Reduce(union,lapply(matlist,colnames))
unionMat = sapply(matlist,function(i)i[,match(allelem,colnames(i))])
mat1 mat2 mat3
REBQG1509K 42 1 20
IHZKK6973T 24 10 89
XRSXL1970Q 30 9 88
UNGOW7172K 47 6 NA
RKJFP9148P 61 90 NA
YRVEA1199Q 74 11 NA
SBAUE6979O 23 20 NA
JRVKW2279O 84 NA NA
SSTEO2503H 1 NA NA
LEKKI1679Y 58 NA NA
rowSums(unionMat,na.rm=TRUE)
REBQG1509K IHZKK6973T XRSXL1970Q UNGOW7172K RKJFP9148P YRVEA1199Q SBAUE6979O
63 123 127 53 151 85 43
JRVKW2279O SSTEO2503H LEKKI1679Y
84 1 58
如何实现这一目标?我怀疑有许多不同的方法可以实现这一目标。一种可能的方法是从列表中创建一个数据框,该数据框将组合来自相似名称的值。给定名称缺少的元素将是
NA
。然后,使用colSums
计算和,并将结果显示为转置矩阵
library(dplyr)
bind_rows(lapply(matlist, as.data.frame)) %>%
colSums(na.rm = TRUE) %>%
as.matrix() %>%
t()
我怀疑有很多不同的方法来解决这个问题。一种可能的方法是从列表中创建一个数据框,该数据框将组合来自相似名称的值。给定名称缺少的元素将是
NA
。然后,使用colSums
计算和,并将结果显示为转置矩阵
library(dplyr)
bind_rows(lapply(matlist, as.data.frame)) %>%
colSums(na.rm = TRUE) %>%
as.matrix() %>%
t()
也许是这样:
YDBTT5207K DJTTX5635J XADWJ8211U SPPLC7331C DKSHW5279Z VSTXA0199O RELXP9721L SQQFH3616Q JFZFB3125N NWKCT9607I
[1,] 234 205 146 138 153 138 111 15 63 55
allelem = Reduce(union,lapply(matlist,colnames))
unionMat = sapply(matlist,function(i)i[,match(allelem,colnames(i))])
mat1 mat2 mat3
REBQG1509K 42 1 20
IHZKK6973T 24 10 89
XRSXL1970Q 30 9 88
UNGOW7172K 47 6 NA
RKJFP9148P 61 90 NA
YRVEA1199Q 74 11 NA
SBAUE6979O 23 20 NA
JRVKW2279O 84 NA NA
SSTEO2503H 1 NA NA
LEKKI1679Y 58 NA NA
rowSums(unionMat,na.rm=TRUE)
REBQG1509K IHZKK6973T XRSXL1970Q UNGOW7172K RKJFP9148P YRVEA1199Q SBAUE6979O
63 123 127 53 151 85 43
JRVKW2279O SSTEO2503H LEKKI1679Y
84 1 58
也许是这样:
YDBTT5207K DJTTX5635J XADWJ8211U SPPLC7331C DKSHW5279Z VSTXA0199O RELXP9721L SQQFH3616Q JFZFB3125N NWKCT9607I
[1,] 234 205 146 138 153 138 111 15 63 55
allelem = Reduce(union,lapply(matlist,colnames))
unionMat = sapply(matlist,function(i)i[,match(allelem,colnames(i))])
mat1 mat2 mat3
REBQG1509K 42 1 20
IHZKK6973T 24 10 89
XRSXL1970Q 30 9 88
UNGOW7172K 47 6 NA
RKJFP9148P 61 90 NA
YRVEA1199Q 74 11 NA
SBAUE6979O 23 20 NA
JRVKW2279O 84 NA NA
SSTEO2503H 1 NA NA
LEKKI1679Y 58 NA NA
rowSums(unionMat,na.rm=TRUE)
REBQG1509K IHZKK6973T XRSXL1970Q UNGOW7172K RKJFP9148P YRVEA1199Q SBAUE6979O
63 123 127 53 151 85 43
JRVKW2279O SSTEO2503H LEKKI1679Y
84 1 58
你认为这个答案比dplyr版本快吗?哈哈。。很难说,如果你的矩阵很大,那么是的,因为你浪费了一些时间从data.frame转换到矩阵..你没有一个巨大的矩阵我希望你认为这个答案比dplyr版本快吗?哈哈。。很难说,如果你的矩阵是巨大的,那么是的,因为你在从data.frame到矩阵的转换上浪费了一些时间。我希望你没有一个巨大的矩阵