r-如何将多个列表组合到一个数据帧中

r-如何将多个列表组合到一个数据帧中,r,matrix,dataframe,R,Matrix,Dataframe,我试图将两个长度不等的列表组合到一个数据帧中 我从一个包含2个矩阵的列表开始 mtx_a <- matrix(data = c(1:24), nrow = 4) mtx_b <- matrix(data = c(25:36), nrow = 3) row.names(mtx_a) <- c("A", "B", "C", "D") row.names(mtx_b) <- c("A", "B", "C") colnames(mtx_a) <- c("V1", "V2",

我试图将两个长度不等的列表组合到一个数据帧中

我从一个包含2个矩阵的列表开始

mtx_a <- matrix(data = c(1:24), nrow = 4)
mtx_b <- matrix(data = c(25:36), nrow = 3)
row.names(mtx_a) <- c("A", "B", "C", "D")
row.names(mtx_b) <- c("A", "B", "C")
colnames(mtx_a) <- c("V1", "V2", "W1", "W2", "X1", "X2")
colnames(mtx_b) <- c("Y1", "Y2", "Z1", "Z2")
mtx_list <- list(mtx_a, mtx_b)
names(mtx_list) <- c("mtx_a", "mtx_b")
mtx_list
我尝试过以下方法,但没有成功:

list(cond_1, cond_2)
library(plyr)
ldply(c(cond_1, cond_2))

您可以使用
Map
cbind
相应的列表元素

do.call(rbind, Map(cbind, cond_1, cond_2))
#     [,1] [,2]
#[1,]    1    5
#[2,]    9   13
#[3,]   17   21
#[4,]   25   28
#[5,]   31   34
多做一点工作会给你带来更好的结果

data.frame(mtx = unlist(lapply(1:length(cond_1),
                               function(i)
                                   rep(names(cond_1)[i], length(cond_1[[i]])))),
    do.call(rbind, Map(cbind, cond_1, cond_2)))
#    mtx X1 X2
#1 mtx_a  1  5
#2 mtx_a  9 13
#3 mtx_a 17 21
#4 mtx_b 25 28
#5 mtx_b 31 34

下面是一个使用
sapply
的替代方法。我将它包装在一个函数中,以便于重复使用

getter <- function(rowName) {
  # loop through matrices in list, pull out rows that match name
  temp <- unlist(sapply(mtx_list, function(x) x[rowName,]), use.names=FALSE)
  # return data.frame with alternating values
  data.frame(var1=temp[c(TRUE, FALSE)], var2=temp[c(FALSE, TRUE)])
}

getter("A")
  var1 var2
1    1    5
2    9   13
3   17   21
4   25   28
5   31   34
getter首先提取所有
“A”
行,然后将其输入到一个2列矩阵中:

matrix(unlist(lapply(mtx_list, `[`, "A", )), ncol=2, byrow=TRUE)
#     [,1] [,2]
#[1,]    1    5
#[2,]    9   13
#[3,]   17   21
#[4,]   25   28
#[5,]   31   34
如果需要,可以将其包装在
data.frame()

data.frame(mtx = unlist(lapply(1:length(cond_1),
                               function(i)
                                   rep(names(cond_1)[i], length(cond_1[[i]])))),
    do.call(rbind, Map(cbind, cond_1, cond_2)))
#    mtx X1 X2
#1 mtx_a  1  5
#2 mtx_a  9 13
#3 mtx_a 17 21
#4 mtx_b 25 28
#5 mtx_b 31 34
getter <- function(rowName) {
  # loop through matrices in list, pull out rows that match name
  temp <- unlist(sapply(mtx_list, function(x) x[rowName,]), use.names=FALSE)
  # return data.frame with alternating values
  data.frame(var1=temp[c(TRUE, FALSE)], var2=temp[c(FALSE, TRUE)])
}

getter("A")
  var1 var2
1    1    5
2    9   13
3   17   21
4   25   28
5   31   34
matrix(unlist(lapply(mtx_list, `[`, "A", )), ncol=2, byrow=TRUE)
#     [,1] [,2]
#[1,]    1    5
#[2,]    9   13
#[3,]   17   21
#[4,]   25   28
#[5,]   31   34