【问题标题】:Extract rows by rank and condition in R在R中按等级和条件提取行
【发布时间】:2021-01-18 20:13:54
【问题描述】:

我试图了解如何根据一个数字列中的值从表中提取前十行,但仅从满足应用于第二个数字列的条件的行中提取。
先说一下数据。我有一个表格,列出了几千个人类基因的表达差异(log_fold_change)和这种差异的 p 值(p_value)。该表如下所示:

       log_fold_change   p_value
APOD         1.7388209 0.4820801
S100B       -1.1514299 0.5995658
CD63         0.6066951 0.4935413
PMEL        -1.4977796 0.1862176
MT2A        -0.9311173 0.8273733
S100A6      -0.4555436 0.6684667
TIMP1       -1.9464387 0.7942399
VIM         -0.4704482 0.1079436
PAEP         1.4787634 0.7237109
CSTB        -0.6386040 0.4112744

可以使用这些命令重新创建数据(创建一个包含n 虚构基因数据的表):

n <- 50    
log_fold_change <- runif(n, -2.0, 2.0)
p_value <- runif(n, 0, 1.0)  
df <- data.frame(log_fold_change, p_value)
rownames(df) <- stringi::stri_paste(stringi::stri_rand_strings(n, 3, '[A-Z]'),stringi::stri_rand_strings(n, 1, '[1-9]'))

我为标签创建了一个列 (df$label &lt;- NA),我计划在其中传输我在绘制图表时想要标记的基因名称。你问哪个基因?我希望在log_fold_change 为阳性的基因中,提取出p_value 最小的十个基因。
我已经找到了一种方法来提取和标记最小p_value的10个基因:

df$label[with(df, rank(p_value)) %in% c(1:10)] <- rownames(df)[with(df, rank(p_value)) %in% c(1:10)]

现在,我如何强制执行条件df$log_fold_change &gt; 0,以便我的十个具有最小p_value 的基因仅从具有阳性log_fold_change 的基因中选出?任何帮助将不胜感激!

【问题讨论】:

    标签: r dataframe conditional-statements rank


    【解决方案1】:

    dplyr解决方案:

    library(dplyr)
    
    df %>%
      filter(log_fold_change > 0) %>%
      arrange(p_value) %>%
      head(10) %>%
      mutate(labels = rownames(.))
    

    输出:

          A data.frame: 10 × 3
    log_fold_change p_value label
       <dbl>       <dbl>    <chr>
    0.9672121   0.01423086  MBT4
    1.7139128   0.05044393  INQ3
    0.4809652   0.10347463  ORW1
    0.2949034   0.13493936  FVR2
    0.9967781   0.17676960  JHP1
    1.0813577   0.23599439  ITE9
    1.0670343   0.25001069  ANQ4
    1.5954271   0.26273176  XVL8
    1.8803123   0.30065841  IQV6
    0.3591054   0.46889062  JLD9
    

    首先,您在log_fold_change 列中用filter(log_fold_change &gt; 0) 丢弃所有小于或等于0 的观察值。然后用arrange(p_value) 以升序排列p_value 列,用head(10) 选择前10 个观察值。最后使用 mutate() 创建带有基因名称的 label 列。这为您提供了 10 个观察值,其中p_value 最低,其中log_fold_change 为正数。

    【讨论】:

      【解决方案2】:

      您可以先对数据排序,获取log_fold_change &gt; 0 所在的10 个值,然后将行名转移到label 列。

      df <- df[order(df$log_fold_change), ]
      inds <- which(df$log_fold_change > 0)[1:10]
      df$label[inds] <- rownames(df)[inds]
      

      这将保持您原来的 df 不变,并且您将只在这 10 行中拥有 label

      如果你只想要那 10 行,你可以这样做:

      df1 <- df[inds, ]
      

      【讨论】:

        【解决方案3】:

        使用 base R 可以这样实现:

        1. log_fold_change &gt; 0分割你的df。
        2. 为每个拆分单独设置标签
        3. 重新绑定在一起
        n <- 50    
        log_fold_change <- runif(n, -2.0, 2.0)
        p_value <- runif(n, 0, 1.0)  
        df <- data.frame(log_fold_change, p_value)
        rownames(df) <- stringi::stri_paste(stringi::stri_rand_strings(n, 3, '[A-Z]'),stringi::stri_rand_strings(n, 1, '[1-9]'))
        
        df_split <- split(df, df$log_fold_change > 0) 
        df_split[["FALSE"]]$label <- NA
        df_split[["TRUE"]]$label <- with(df_split[["TRUE"]], rank(-p_value))
        df_split[["TRUE"]]$label <- ifelse(df_split[["TRUE"]]$label %in% 1:10, row.names(df_split[["TRUE"]]), NA)
        df <- rbind(df_split[["FALSE"]], df_split[["TRUE"]])
        
        df[!is.na(df$label),]
        #>      log_fold_change   p_value label
        #> IPQ1      1.46479105 0.9928132  IPQ1
        #> GDA3      0.26974526 0.9696272  GDA3
        #> CHU3      0.31643010 0.7094205  CHU3
        #> IDE1      0.87836008 0.7152144  IDE1
        #> KQJ9      1.12647503 0.7854047  KQJ9
        #> FQM8      1.99924827 0.8463336  FQM8
        #> RPO1      0.10874876 0.7279679  RPO1
        #> TOA9      1.88312825 0.7143039  TOA9
        #> EXG7      1.82497903 0.8082063  EXG7
        #> RGE9      0.02894958 0.7685504  RGE9
        

        reprex package (v0.3.0) 于 2020 年 10 月 3 日创建

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-16
          • 1970-01-01
          • 2019-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多