【问题标题】:Convert unequal length columns into named list in R将不等长的列转换为R中的命名列表
【发布时间】:2020-10-07 06:27:10
【问题描述】:

我目前有一个列长度不等的数据框,称为“gene_clusters”

> gene_clusters

  hi    lo    mid
  gene1 gene5 gene3
  gene2 gene8 gene9
  gene7 NA    gene10
  NA    NA    gene4

我已经从 excel 中导入了它,所以我认为 R 试图通过用 NA 填充它们来补偿不相等的长度。本质上,我想创建一个这样的命名列表:

>GeneList
## $hi
## [1] "gene1" "gene2" "gene7"  
## 
## $lo
## [1] "gene5" "gene8"  
## 
## $mid
## [1] "gene3" "gene9" "gene10" "gene4"   

(这只是我的数据的一个例子,但实际上我有> 100个基因)

【问题讨论】:

  • lapply(df, function(x) x[!is.na(x)])

标签: r list dataframe


【解决方案1】:

使用na.omit 删除所有NA 值,但na.omit 返回许多可以删除的属性。

sapply(df, function(x) {x1 <- na.omit(x);attributes(x1) <- NULL;x1})

#$hi
#[1] "gene1" "gene2" "gene7"

#$lo
#[1] "gene5" "gene8"

#$mid
#[1] "gene3"  "gene9"  "gene10" "gene4" 

如果您的列名没有数字作为共享示例,您也可以使用split

tmp <- na.omit(unlist(df))
split(tmp, gsub('\\d+', '', names(tmp)))

【讨论】:

    【解决方案2】:

    我们可以使用来自base Rstack/split 来做到这一点

    with(na.omit(stack(df)[2:1]), split(values, ind))
    #$hi
    #[1] "gene1" "gene2" "gene7"
    
    #$lo
    #[1] "gene5" "gene8"
    
    #$mid
    #[1] "gene3"  "gene9"  "gene10" "gene4" 
    

    lapply

    lapply(df, function(x) x[complete.cases(x)])
    

    数据

    df <- structure(list(hi = c("gene1", "gene2", "gene7", NA), 
    lo = c("gene5", 
    "gene8", NA, NA), mid = c("gene3", "gene9", "gene10", "gene4"
    )), class = "data.frame", row.names = c(NA, -4L))
    

    【讨论】:

      【解决方案3】:

      使用地图

      > map(df,~ .[!is.na(.)])
      $hi
      [1] "gene1" "gene2" "gene7"
      
      $lo
      [1] "gene5" "gene8"
      
      $mid
      [1] "gene3"  "gene9"  "gene10" "gene4" 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 1970-01-01
        相关资源
        最近更新 更多