R语言 替换向量中的给定值

gupuwyp2  于 2023-02-01  发布在  其他
关注(0)|答案(8)|浏览(208)

我正在寻找一个函数,它可以将所有出现的一个值替换为另一个值。例如,我想将所有的0替换为1。我不想将结果存储在变量中,但希望能够匿名地将向量用作更大表达式的一部分。
我自己知道如何编写合适的函数:

> vrepl <- function(haystack, needle, replacement) {
+   haystack[haystack == needle] <- replacement
+   return(haystack)
+ }
> 
> vrepl(c(3, 2, 1, 0, 4, 0), 0, 1)
[1] 3 2 1 1 4 1

但是我想知道是否有一些标准函数来完成这项工作,最好是来自base包,作为其他一些常用包的替代品,我相信使用这样的标准可能会使我的代码更具可读性,而且我不必在需要的时候重新定义该函数。

sycxhyv7

sycxhyv71#

也许replace正是您正在寻找的:

> x = c(3, 2, 1, 0, 4, 0)
> replace(x, x==0, 1)
[1] 3 2 1 1 4 1

或者,如果您没有x(有任何具体的原因吗?):

replace(c(3, 2, 1, 0, 4, 0), c(3, 2, 1, 0, 4, 0)==0, 1)

许多人都熟悉gsub,因此您也可以尝试以下方法之一:

as.numeric(gsub(0, 1, x))
as.numeric(gsub(0, 1, c(3, 2, 1, 0, 4, 0)))

更新

看完评论后,也许with是一个选项:

with(data.frame(x = c(3, 2, 1, 0, 4, 0)), replace(x, x == 0, 1))
4sup72z8

4sup72z82#

另一个更简单的选项是:

> x = c(1, 1, 2, 4, 5, 2, 1, 3, 2)
 > x[x==1] <- 0
 > x
 [1] 0 0 2 4 5 2 0 3 2
4urapxun

4urapxun3#

一个简单的方法是使用矢量化的ifelse,如果满足条件,我们使用替换值,否则使用原始值。

v <- c(3, 2, 1, 0, 4, 0)
ifelse(v == 0, 1, v)

我们可以通过使用管道来避免命名变量。

c(3, 2, 1, 0, 4, 0) %>% ifelse(. == 0, 1, .)

一个常见的任务是进行多次替换,我们可以使用dplyr中的case_when来代替嵌套的ifelse语句:

case_when(v == 0 ~ 1,
          v == 1 ~ 2,
          TRUE ~ v)

旧答案:
对于因子或特征向量,我们可以使用plyr中的revalue

> revalue(c("a", "b", "c"), c("b" = "B"))
[1] "a" "B" "c"

这样做的好处是只指定一次输入向量,因此我们可以使用类似

x %>% revalue(c("b" = "B"))
lb3vh1jj

lb3vh1jj4#

要替换多个号码:

vec <- 1:10
replace(vec, vec== c(2,6), c(0,9)) #2 and 6 will be replaced by 0 and 9.
    • 编辑:**

对于一个连续的序列,你可以这样做vec <- c(1:10); replace(vec, vec %in% c(2,6), c(0,9)),但是对于vec <- c(1:10,2,2,2); replace(vec, vec %in% c(2,6), 0),我们可以用一个值代替多个值。

roqulrg3

roqulrg35#

为什么这么大惊小怪?

replace(haystack, haystack %in% needles, replacements)

演示:

haystack <- c("q", "w", "e", "r", "t", "y")
needles <- c("q", "w")
replacements <- c("a", "z")

replace(haystack, haystack %in% needles, replacements)
#> [1] "a" "z" "e" "r" "t" "y"
rqqzpn5f

rqqzpn5f6#

ifelse函数将是一种快速简便的方法。

vktxenjb

vktxenjb7#

如果你想一次替换很多值,你可以使用"library(car)"。

    • 示例**
library(car)

x <- rep(1:5,3)

xr <- recode(x, '3=1; 4=2')

x
## [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
xr
## [1] 1 2 1 2 5 1 2 1 2 5 1 2 1 2 5
cbeh67ev

cbeh67ev8#

如果有人正在寻找replace的替代品,case_matchcase_when的一个简单变体,可以在向量上工作。

x = c(3, 2, 1, 0, 4, 0)
case_match(x, 0 ~ 1, .default = x)
#[1] 3 2 1 1 4 1

它还可以用于多个替换:

x = c(3, 2, 1, 0, 4, 0)
case_match(x, 
           c(0, 2, 4) ~ "even",
           c(1, 3) ~ "odd")
#[1] "odd"  "even" "odd"  "even" "even" "even"

相关问题