根据条件

时间:2018-04-17 21:13:22

标签: r sum multiple-columns

我有一个如下所示的数据集:

scaf   pos   ref   A-1   A-2   A-3   A-4   B-1   B-2   B-3   B-4
MT1   11722   A    330    0     0     0    111    0    0     0
MT1   11723   T     0    230    0     8     0    18    0     2
MT1   11724   A    222    2     6     0    56     8    0     0

这是我想要做的。对于每一行:

如果ref = A,则将A-2到A-4和B-2到B-4的总和

如果ref = T,则将A-1,A-3和A4列加在一起,并将B-1,B3和B-4加在一起

如果ref = C,则将A-1,A-2和A4列加在一起。与B列相同

如果ref = G,则将列A-1至A-3和B1至B3相加。

你最终会得到:

scaf   pos   ref   A    B
MT1   11722   A    0    0
MT1   11723   T    8    2
MT1   11724   A    8    8

知道我怎么能这样做吗?请记住,我有大约100列和数千行。

谢谢!

1 个答案:

答案 0 :(得分:2)

使用`dplyr :: case_when'的一个选项可以是:

df %>% mutate(A = case_when(
      ref == "A" ~ A.2+A.4,
      ref == "T" ~ A.1+A.3+A.4,
      ref == "C" ~ A.1+A.2+A.4,
      ref == "G" ~ A.1+A.3
                           )) %>% 
        mutate(B = case_when(
        ref == "A" ~ B.2+B.4,
        ref == "T" ~ B.1+B.3+B.4,
        ref == "C" ~ B.1+B.2+B.4,
        ref == "G" ~ B.1+B.3
                     )) %>%
      select(scaf, pos, ref, A, B)

#   scaf   pos ref A B
# 1  MT1 11722   A 0 0
# 2  MT1 11723   T 8 2
# 3  MT1 11724   A 2 8              

数据:

df <- read.table(text = 
"scaf   pos   ref   A-1   A-2   A-3   A-4   B-1   B-2   B-3   B-4
MT1   11722   A    330    0     0     0    111    0    0     0
MT1   11723   T     0    230    0     8     0    18    0     2
MT1   11724   A    222    2     6     0    56     8    0     0",
header = TRUE, stringsAsFactors = FALSE)