我有一个很大的数据框,我想将其转换为列表列表。列表将按数据框的列名称进行拆分。 数据框如下所示。
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)
}
我们将不胜感激。
答案 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