我有这个载体 b <- c(1, 2, 2, 1, 2, 1, 1, 2, 2, 1)
我需要将所有1s替换为2s,将所有2s替换为1s.
我已经尝试过替换选项以及b==1 <- 2
但它需要同时工作.怎么样
一堆不同的方法来做到这一点.不知道你为什么要同时做...
但如果你绝对痴迷于此,那怎么样:
b <- ifelse(b == 1, 2, 1)
或者您可以编写一个简单的交换函数:
swap <- function(x){ if(length(us <- unique(x)) > 2L) stop("this function is too naive for this vector") out <- vector(class(x), length(x)) out[x == us[1L]] <- us[2L] out[x == us[2L]] <- us[1L] out }
Jota添加了查找表方法
b <- c("1" = 2, "2" = 1)[b]
类似的版本是使用factor
s:
b <- factor(b, levels = c("1" = 2, "2" = 1))
(看起来这看起来没用,直到你看一下as.integer(b)
)
这应该更普遍地工作,例如b <- c(1, 1, 2, 2, 2, 3); c("1" = 3, "2" = 1, "3" = 2)[b]
,但如果这似乎有点难以绕过最好的方式可能只是一步一步:
idx <- which(b == 1) b[idx] <- 2 b[-idx] <- 1
另一种方式(受尼古拉的答案启发)是:
b <- (idx <- b == 1)*2 + !idx