R.根据具有不同级别的其他2列的值重新编码列

时间:2018-02-06 01:36:00

标签: r dataframe recode

我有一个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

非常感谢

3 个答案:

答案 0 :(得分:3)

在设置t ar g e ts 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)

我们可以使用lapplyifelse来执行替换。

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