我有一个如下所示的数据集:
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列和数千行。
谢谢!
答案 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)