我有一个10000行和1000列的数据框,如下所示:
ID a0 a1 V1 V2 V3
rs1 G A 0 0 1
rs2 C T 1 0 0
rs3 T C 0 1 1
a0和a1可以是A,T,C或G,并指示其他列是0还是1.例如,在第二行中,a0 = G且a1 = A,因此V1 = 0(G) ,V2 = 0(G),V3 = 1(A)。我希望输出数据框如下:
ID a0 a1 V1 V2 V3
rs1 G A G G A
rs2 C T T C C
rs3 T C T C C
非常感谢
答案 0 :(得分:3)
在设置t
ar g
e t
和s
ou rc
变量之后,矩阵索引到救援:
tgt <- c("V1","V2","V3")
src <- c("a0","a1")
dat[tgt] <- dat[src][cbind(seq_len(nrow(dat)), unlist(dat[tgt]+1))]
# ID a0 a1 V1 V2 V3
#1 rs1 G A G G A
#2 rs2 C T T C C
#3 rs3 T C T C C
答案 1 :(得分:2)
我们可以使用lapply
和ifelse
来执行替换。
dat[, -(1:3)] <- lapply(dat[, -(1:3)], function(x){
x <- ifelse(x == 0, dat[, 2], dat[, 3])
return(x)
})
dat
# ID a0 a1 V1 V2 V3
# 1 rs1 G A G G A
# 2 rs2 C T T C C
# 3 rs3 T C T C C
数据强>
dat <- read.table(text = "ID a0 a1 V1 V2 V3
rs1 G A 0 0 1
rs2 C T 1 0 0
rs3 T C 0 1 1",
header = TRUE, stringsAsFactors = FALSE)
答案 2 :(得分:2)
以下是使用case_when
dplyr
的选项
library(dplyr)
df1 %>%
mutate_at(vars(matches("^V\\d+")), funs(case_when(!. ~ df1$a0, TRUE ~ df1$a1)))
# ID a0 a1 V1 V2 V3
#1 rs1 G A G G A
#2 rs2 C T T C C
#3 rs3 T C T C C