替换向量中的给定值

时间:2012-07-31 09:37:30

标签: r replace

我正在寻找一个函数,它将所有出现的一个值替换为另一个值。 例如,我想将所有零替换为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包,作为其他一些常用包的替代品。我相信使用这样的标准可能会使我的代码更具可读性,而且我不需要在任何需要的地方重新定义该函数。

7 个答案:

答案 0 :(得分:49)

或许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))

答案 1 :(得分:13)

另一个更简单的选择是:

 > 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

答案 2 :(得分:5)

要替换多个号码:

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),我们可以用一个值替换多个值。

答案 3 :(得分:2)

对于 factor character 向量,我们可以使用revalue中的plyr

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

这具有只指定一次输入向量的优点,因此我们可以使用

这样的管道
x %>% revalue(c("b" = "B"))

答案 4 :(得分:1)

ifelse功能将是一种快速简便的方法。

答案 5 :(得分:1)

为什么大惊小怪?

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"

答案 6 :(得分:0)

如果您想一次性替换很多值,可以使用'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