【问题标题】:paste list based on a logical operator combined with identical matching IDs基于逻辑运算符和相同匹配 ID 的粘贴列表
【发布时间】:2017-08-11 17:35:43
【问题描述】:

我是 R 新手,我会尽力解释我的问题。

我在一个有 15571 个 obs 和 18976 个变量的数据框中工作。 colnames 和 rownames 是基因名称,它们中的大多数具有相同的名称匹配。这些条目仅包含数值并且是相关值。这就是它的样子。

        [GENE128]  [GENE271]  [GENE2983] 
[GENE231] 0.71       0.98       0.32
[GENE128] 0.23       0.61       0.90
[GENE271] 0.87       0.95       0.63

我要做的是编写一个代码,在其中粘贴一个列表,其中包含带有逻辑运算符 x > 0.8 的 df 中的所有基因,并且只有基因名(列名和行名)相同的基因所以在上面的例子中,在这种情况下,只有“GENE271”才会是“TRUE”。

有没有办法做到这一点?

【问题讨论】:

    标签: r list match operator-keyword


    【解决方案1】:

    您的示例数据作为数据框

    vec = c( 0.71,0.98,0.32,0.23,0.61,0.90,0.87,0.95,0.63)
    mt  = matrix(vec, 3, 3, byrow = T)
    coln = c('GENE128', 'GENE271', 'GENE2983')
    rown = c('GENE231', 'GENE128', 'GENE271')
    
    df = data.frame(mt)
    colnames(df) = coln
    rownames(df) = rown
    

    使用行名和列名来构建一个新的数据框并对值进行矢量化

    ndf = data.frame(coln = as.vector(sapply(coln, function(x) rep(x, ncol(df)))), rown = rep(rown, ncol(df)), data = as.vector(as.matrix(df)), stringsAsFactors = F)
    
    idx_true = sapply(1:nrow(ndf), function(x) ndf[x, 1] == ndf[x, 2])
    
    subs_ndf = ndf[idx_true, ]
    
    subs_ndf[which(ndf[idx_true, 'data'] > 0.8 ), ]
    

    输出

         coln    rown data
    6 GENE271 GENE271 0.95
    

    【讨论】:

      【解决方案2】:

      我相信有人有更好、更快的方法。这种方式会很慢,但它应该可以工作....

      test <- data.frame(GENE128 = c(0.71,0.23,0.87), GENE271 = c(0.98,0.61,0.95),
                         GENE2983 = c(0.32,0.90,0.63))
      row.names(test) <- c('GENE231', 'GENE128', 'GENE271')
      
      gene.equal <- function(x, limit = 0.8){
        df <- c()
        for(i in 1:nrow(x)){
          row <- x[i,]
          indexes <- which(row.names(row) == colnames(x))
          if(length(indexes) > 0 && row[,indexes] > limit){
            row[,indexes] <- 'TRUE'
          }
          df <- rbind(df, row)
        }
        df
      }
      
      
      new.df <- gene.equal(x = test)
      

      我将'TRUE' 设为文本,否则如果您使用TRUE(无引号),它会将其转换为“1.00”。

      【讨论】:

      • 我写这篇文章是假设您想用“真”替换这些值。如果您只想要匹配的输出,另一个答案会更好。
      【解决方案3】:

      以下语句分两步提供所需的结果(df 是您的数据框)。

      > df <- df[which(row.names(df) %in% colnames(df) & df >= 0.8),]
      > df
              GENE128 GENE271 GENE2983
      GENE271    0.87    0.95     0.63
      NA           NA      NA       NA
      NA.1         NA      NA       NA
      > na.omit(df)
              GENE128 GENE271 GENE2983
      GENE271    0.87    0.95     0.63
      

      我必须使用na.omit(df) 来摆脱那些NA,但该解决方案无需运行复杂代码即可提供准确的数据。

      【讨论】:

        猜你喜欢
        • 2022-10-01
        • 2016-05-21
        • 1970-01-01
        • 2014-03-21
        • 1970-01-01
        • 2011-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多