【问题标题】:r - How to combine multiple lists of lists into a dataframer - 如何将多个列表列表组合成一个数据框
【发布时间】:2017-09-01 20:25:22
【问题描述】:

我正在尝试将 2 个长度不等的列表组合到一个数据框中。

我从一个包含 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

我已根据要检查的行名提取了特定行。

mtx_list <- lapply(mtx_list, function(mtx_list){
  mtx_list[row.names(mtx_list) %in% c("A"),]})

接下来,我根据索引提取了特定列。 (交替列相当于条件 1 和 2)。

cond_1 <- lapply(lapply(mtx_list, function(mtx_list) {
  mtx_list[c(T,F)]}), unname)
cond_2 <- lapply(lapply(mtx_list, function(mtx_list) {
  mtx_list[c(F,T)]}), unname)

我正在尝试生成如下所示的数据框:

        cond_1   cond_2 
mtx_a   1        5
mtx_a   9        13
mtx_a   17       21
mtx_b   25       28
mtx_b   31       34

我尝试了以下方法,但没有任何成功:

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

【问题讨论】:

    标签: r matrix dataframe


    【解决方案1】:

    首先提取所有"A" 行,然后只输入一个两列矩阵:

    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() 中。

    【讨论】:

      【解决方案2】:

      您可以使用Mapcbind 各自的列表元素。

      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
      

      【讨论】:

        【解决方案3】:

        这是使用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
        

        请注意,列表中的所有矩阵都必须包含行名才能使此函数起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-01
          • 2015-08-26
          • 1970-01-01
          • 2014-06-04
          相关资源
          最近更新 更多