我有一个包含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
答案 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)))
我们用它作为输入。请注意,c1
,c2
和c3
被假定为字符,而不是因素,余数为数字。
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)