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