簡體   English   中英

根據條件求和的列

[英]Sum columns based on condition

我有一個看起來像這樣的數據集:

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列和數千行。

謝謝!

使用`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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM