R.如果两列匹配,则有条件地替换数据帧中的字符

时间:2018-01-12 19:31:15

标签: r dataframe replace recode

我有一个包含c1到c11列的数据框,如下所示:

c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11  
G A G 1 1 0 1 1 0 0 1
T C T 0 0 1 1 0 1 0 1
C C T 0 1 1 1 1 1 1 0

我想执行以下操作:如果c1中的字符与c3相同,则从c4到c11,1s替换为2s,0s替换为3s。否则,将1s替换为3s,将0s替换为2s

最后我会得到这个数据框:

c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11  
G A G 2 2 3 2 2 3 3 2
T C T 3 3 2 2 3 2 3 2
C C T 2 3 3 3 3 3 3 2

2 个答案:

答案 0 :(得分:3)

1)将x = 0,1转换为y = 3,2与从3减去x相同。同样将x = 0,1转换为y = 2,3,将2添加到x。因此:

DF[4:11] <- with(DF, (c1 == c3) * (3 - DF[4:11]) + (c1 != c3) * (DF[4:11] + 2))

,并提供:

> DF
  c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11
1  G  A  G  2  2  3  2  2  3   3   2
2  T  C  T  3  3  2  2  3  2   3   2
3  C  C  T  2  3  3  3  3  3   3   2

2)也可以这样做,这个更长,但更直接来自想要的定义:

DF[4:11] <- with(DF, (c1 == c3) * (2 * (DF[4:11] == 1) + 3 * (DF[4:11] == 0)) +
                     (c1 != c3) * (3 * (DF[4:11] == 1) + 2 * (DF[4:11] == 0)))

注意

我们用它作为输入。请注意,c1c2c3被假定为字符,而不是因素,余数为数字。

Lines <- "
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11  
G A G 1 1 0 1 1 0 0 1
T C T 0 0 1 1 0 1 0 1
C C T 0 1 1 1 1 1 1 0"
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE)

答案 1 :(得分:1)

尝试以下方法。它使用嵌套的ifelse和索引向量。也许有更简单的方法,但这个只使用基础R。

fun <- function(x){
    ifelse(inx,
        ifelse(x == 1, 2, 3),
        ifelse(x == 1, 3, 2)
    )
}

inx <- as.character(data$c1) == as.character(data$c3)
data[4:11]  <- lapply(data[4:11], fun)