【问题标题】:Filter data based on sum of two rows根据两行之和过滤数据
【发布时间】:2019-05-17 03:56:24
【问题描述】:

我想将总乘积小于 5 行的样本中的值更改为零,而其他保持不变。

我试过了:

    dat %>%
      group_by(snpID) %>%
      mutate_at(vars(2:6),
                list(~ifelse(sum(.) < 5, 0, .)))

结果:(两行之和替换每一行)

    dat %>%
      group_by(snpID) %>%
      mutate_at(vars(2:6),
                list(~ifelse(sum(.) < 5, 0, ungroup(.))))

错误:

UseMethod("ungroup") 中的错误: 没有适用于“取消组合”的方法应用于“c('integer', 'numeric')”类的对象

原文:

snpID   f1  f2  f3  m1  m2  m3
A_001   2   5   2   0   1   3
A_001   0   3   8   2   5   10
A_002   11  5   12  7   0   2
A_002   2   6   5   14  5   3

我想要什么:

snpID   f1  f2  f3  m1  m2  m3
A_001   0   5   2   0   1   3
A_001   0   3   8   0   5   10
A_002   11  5   12  7   0   2
A_002   2   6   5   14  5   3

f1m1 样本中 A_001 的总和

任何帮助将不胜感激。

【问题讨论】:

  • 我不确定我是否完全理解您要执行的操作。您要关注哪些行? F 行和 M 行需要交互吗?如果第 1 行的 f1 为 0,为什么最下面一行的 f1 也不是 0?
  • 感谢您帮助我编辑帖子。 F 和 M 列不需要交互。我的基因座 ID 是 A_001 和 A_002。只需要过滤总深度小于 5 的轨迹。demarsylvain 得到了我需要的脚本。

标签: r dplyr


【解决方案1】:

根据您的数据集示例,您需要按loci 而不是snpID 分组。

您编写的ifelse() 应该可以工作。这是一个也应该有效的替代方法:

dat %&gt;% group_by(loci) %&gt;% mutate_at(vars(-loci), list(~replace(., sum(.) &lt; 5, 0)))

【讨论】:

  • 感谢您对帖子编辑的帮助。我和你同时在做这件事。我才发现这么多错误!但是你的脚本有效。所以非常感谢你的帮助:)
猜你喜欢
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 2018-11-05
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多