【问题标题】:Use dplyr to substitute apply使用 dplyr 代替 apply
【发布时间】:2017-06-22 19:33:11
【问题描述】:

我有这样的表(但列数可以不同,我有很多对 ref_* + alt_*):

+--------+-------+-------+-------+-------+
| GeneID | ref_a | alt_a | ref_b | alt_b |
+--------+-------+-------+-------+-------+
|   a1   |   0   |   1   |   1   |   3   |
|   a2   |   1   |   1   |   7   |   8   |
|   a3   |   0   |   1   |   1   |   3   |
|   a4   |   0   |   1   |   1   |   3   |
+--------+-------+-------+---------------+

并且需要过滤掉 ref_a + alt_a 和 ref_b + alt_b dplyr。 我会首先使用 mutate 创建带有总和的列,然后按这些总和进行过滤。但无法弄清楚在这种情况下如何使用 mutate 。

已编辑: 列数不固定!

【问题讨论】:

    标签: r apply dplyr


    【解决方案1】:

    你不需要在这里变异。只需执行以下操作:

    require(tidyverse)
    df %>%
      filter(ref_a + alt_a < 10 & ref_b + alt_b < 10)
    

    如果你想先使用 mutate,你可以选择:

    df %>% 
      mutate(sum1 = ref_a + alt_a, sum2 = ref_b + alt_b) %>%
      filter(sum1 < 10 & sum2 < 10)
    

    编辑:我们事先不知道变量的数量这一事实使它有点复杂。但是,我认为您可以使用以下代码来执行此任务(假设变量名称均以“_a”、“_b”等格式。我希望有更短的方法来执行此任务:)

    df$GeneID <- as.character(df$GeneID)
    
    df %>%
      gather(variable, value,  -GeneID) %>%
      rowwise() %>%
      mutate(variable = unlist(strsplit(variable, "_"))[2]) %>%
      ungroup() %>%
      group_by(GeneID, variable) %>%
      summarise(sum = sum(value)) %>%
      filter(sum < 10) %>% 
      summarise(keepGeneID = ifelse(n() == (ncol(df) - 1)/2, TRUE, FALSE)) %>%
      filter(keepGeneID == TRUE) %>%
      select(GeneID) -> ids
    
    df %>%
      filter(GeneID %in% ids$GeneID)
    

    编辑 2:经过一些返工,我能够稍微改进代码:

    df$GeneID <- as.character(df$GeneID)
    
    df %>%
      gather(variable, value,  -GeneID) %>%
      rowwise() %>%
      mutate(variable = unlist(strsplit(variable, "_"))[2]) %>%
      ungroup() %>%
      group_by(GeneID, variable) %>%
      summarise(sum = sum(value)) %>%
      group_by(GeneID) %>%
      summarise(max = max(sum)) %>%
      filter(max < 10) -> ids
    
    df %>%
      filter(GeneID %in% ids$GeneID)
    

    【讨论】:

    • 谢谢,是的,这适用于固定数量的对。如果我想要 n 对 ref 和 alt 怎么办? @Niko
    • 请查看我编辑的解决方案以使用 n 对值。
    • 谢谢!!现在看起来更复杂了:) 将测试它!
    • 如果我的解决方案适合您,您能接受吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多