根据两行之和过滤数据

时间:2019-05-17 03:56:25

标签: r dplyr

我想将总乘积小于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”)中的错误:     没有适用于“ 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

A_001f1m1的总和小于5,因此两行都返回零值。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

您编写的ifelse()应该可以工作。这是一种应该也可以使用的替代方法:

dat %>% group_by(loci) %>% mutate_at(vars(-loci), list(~replace(., sum(.) < 5, 0)))