根据常见功能将数据框转换为列表列表

时间:2019-05-30 10:35:40

标签: r list dataframe

我有一个很大的数据框,我想将其转换为列表列表。列表将按数据框的列名称进行拆分。 数据框如下所示。

df1 <- data.frame(TP1.expression =c(3, 8, 2),
                  TP1.pval = c(0.04, 0.03, 0.01),
                  TP1.log2fc = c(1, 0.3, 2.1),
                  TP2.expression =c(2, 4, 2.1),
                  TP2.pval = c(0.024, 0.02, 0.01),
                  TP2.log2fc = c(-1, 0.1, 3.1),
                  row.names = c('GeneA', 'GeneB', 'GeneC'))

我想将df1转换为列表列表。理想情况下,列表结构如下。

list1
   TP1
      TP1.expression       3, 8, 2
      TP1.pval             0.04, 0.03, 0.01
      TP1.log2fc           1, 0.3, 2.1
   TP2
      TP2.expression       2, 4, 2.1
      TP2.pval             0.024, 0.02, 0.01
      TP2.log2fc           -1, 0.1, 3.1

因此,列表将拆分为TP.字符之间的整数。

我设法将数据帧拆分为较小的数据帧,然后将它们重新组合为一个列表,但是所使用的方法过于具体。我正在寻找更通用的东西来变成一个功能。

下面的示例将df1分为五个不同的数据帧,然后可以将其重新排序为一个列表。我正在寻找更清洁的方法。

tp <- c(1, 2, 3, 10, 14)
timepoint <- 'TP'
for (i in tp) {
  common <- paste0(timepoint, i)
  assign(common, df1[, grep(paste0(common, "\\."),   colnames(df1), ignore.case = T)])
  X <- list(TP1, TP2, TP3, TP10, TP14)
}

我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

我们可以使用split.default根据数据框的名称拆分列,然后使用as.list创建列表列表。

lapply(split.default(df1, sub("(TP\\d+).*", "\\1", names(df1))), as.list)

#$TP1
#$TP1$TP1.expression
#[1] 3 8 2

#$TP1$TP1.pval
#[1] 0.04 0.03 0.01

#$TP1$TP1.log2fc
#[1] 1.0 0.3 2.1


#$TP2
#$TP2$TP2.expression
#[1] 2.0 4.0 2.1

#$TP2$TP2.pval
#[1] 0.024 0.020 0.010

#$TP2$TP2.log2fc
#[1] -1.0  0.1  3.1