【问题标题】:Convert a dataframe to a list of lists based on common features根据共同特征将数据框转换为列表列表
【发布时间】:2019-05-30 18:38:41
【问题描述】:

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

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)
}

非常感谢您的帮助。

【问题讨论】:

    标签: r list dataframe


    【解决方案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
    

    【讨论】:

    • 嗨,Ronak,谢谢这个工作得很好。你能解释一下 \\d+ 和 \\1 是做什么的吗?
    • @Krutik 它提取 "TP" 后跟一个数字。检查sub("(TP\\d+).*", "\\1", names(df1))
    猜你喜欢
    • 1970-01-01
    • 2020-04-17
    • 2022-11-14
    • 2019-12-25
    相关资源
    最近更新 更多