如何同时在矢量中将值相互更改?

lor*_*ore 1 r vector

我有这个载体 b <- c(1, 2, 2, 1, 2, 1, 1, 2, 2, 1)

我需要将所有1s替换为2s,将所有2s替换为1s.

我已经尝试过替换选项以及b==1 <- 2但它需要同时工作.怎么样

Mic*_*ico 6

一堆不同的方法来做到这一点.不知道你为什么要同时做...

但如果你绝对痴迷于此,那怎么样:

b <- ifelse(b == 1, 2, 1)
Run Code Online (Sandbox Code Playgroud)

或者您可以编写一个简单的交换函数:

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
}
Run Code Online (Sandbox Code Playgroud)

Jota添加了查找表方法

b <- c("1" = 2, "2" = 1)[b]
Run Code Online (Sandbox Code Playgroud)

类似的版本是使用factors:

b <- factor(b, levels = c("1" = 2, "2" = 1))
Run Code Online (Sandbox Code Playgroud)

(看起来这看起来没用,直到你看一下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
Run Code Online (Sandbox Code Playgroud)

另一种方式(受尼古拉的答案启发)是:

b <- (idx <- b == 1)*2 + !idx
Run Code Online (Sandbox Code Playgroud)