我有一个如下所示的数据集:
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这是我想做的。每一行:
如果if = 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列和数千行。
谢谢!
发布于 2018-04-17 21:34:01
使用`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)https://stackoverflow.com/questions/49887576
复制相似问题