【问题标题】:How to make a for-loop create new columns with info on whether each value is lower or higher than the column mean?如何使for循环创建新列,其中包含每个值是低于还是高于列平均值的信息?
【发布时间】:2020-05-15 20:58:02
【问题描述】:

希望大家有一个愉快的星期五。

我在 R 中工作,在尝试让 for 循环工作时遇到了一些问题。我有一个数据框,其中列包含许多基因的表达数据,行代表不同的患者。我想为每个基因添加一列,显示患者的表达是否高于中位数。

geneA <- c(2,4,1,1,2,5)
geneB <- c(1,1,3,2,2,1)
geneC <- c(3,4,3,5,7,4)

expressiondata<- as.data.frame(cbind(geneA, geneB, geneC))

我想要达到的结果是这样的:

geneA_median <- ifelse(geneA>median(geneA), 1,0)
geneB_median <- ifelse(geneB>median(geneB), 1,0)
geneC_median <- ifelse(geneC>median(geneC), 1,0)

expressiondata<- cbind(expressiondata, geneA_median, geneB_median, geneC_median)

但是,当我尝试让循环同时通过列和行时,我搞砸了。有谁知道我应该怎么做?我将不胜感激!

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    不需要循环,只需要矢量化代码即可。

    expressiondata <- data.frame(geneA, geneB, geneC)
    
    mu <- sapply(expressiondata, median)
    df2 <- cbind(expressiondata, +t(t(expressiondata) > mu))
    names(df2)[4:6] <- paste(names(df2)[4:6], "_median")
    df2
    

    【讨论】:

    • 非常感谢!这种帮助对我来说很有价值。我肯定需要更多地练习矢量化代码 :) 希望你周末愉快!
    【解决方案2】:

    dplyr 的替代解决方案:

    library(dplyr)
    expressiondata <- expressiondata %>%
      mutate(geneA_median = case_when(geneA > median(geneA) ~ 1,
                                      TRUE ~ 0),
             geneB_median = case_when(geneB > median(geneB) ~ 1,
                                      TRUE ~ 0),
             geneC_median = case_when(geneC > median(geneC) ~ 1,
                                      TRUE ~ 0))
    

    【讨论】:

      【解决方案3】:

      不需要遍历行来计算“高于中值”指标的向量。

      expressiondata <- data.frame(geneA = c(2,4,1,1,2,5),
                                   geneB = c(1,1,3,2,2,1),
                                   geneC = c(3,4,3,5,7,4))
      
      
      # process with a loop, using vectorized math
      for(i in c("geneA","geneB","geneC")) {
           expressiondata[[paste0(i,"_median")]] <- ifelse(expressiondata[i]>median(expressiondata[[i]]), 1,0)
      }
      

      ...以及通过 RStudio 查看器查看的输出:

      我们可以通过从 for() 循环内的原始数据框中提取列名来扩展解决方案,以处理其所有列。

      # extend the solution by using column names from original data frame
      for(i in colnames(expressiondata)) {
           expressiondata[[paste0(i,"_median")]] <- ifelse(expressiondata[i]>median(expressiondata[[i]]), 1,0)
      }
      

      【讨论】:

        猜你喜欢
        • 2020-07-16
        • 1970-01-01
        • 2017-02-18
        • 2021-08-12
        • 2013-01-24
        • 1970-01-01
        • 1970-01-01
        • 2019-05-01
        • 1970-01-01
        相关资源
        最近更新 更多