我正在寻找一个函数,它可以将所有出现的一个值替换为另一个值。例如,我想将所有的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
包,作为其他一些常用包的替代品,我相信使用这样的标准可能会使我的代码更具可读性,而且我不必在需要的时候重新定义该函数。
8条答案
按热度按时间sycxhyv71#
也许
replace
正是您正在寻找的:或者,如果您没有
x
(有任何具体的原因吗?):许多人都熟悉
gsub
,因此您也可以尝试以下方法之一:更新
看完评论后,也许
with
是一个选项:4sup72z82#
另一个更简单的选项是:
4urapxun3#
一个简单的方法是使用矢量化的
ifelse
,如果满足条件,我们使用替换值,否则使用原始值。我们可以通过使用管道来避免命名变量。
一个常见的任务是进行多次替换,我们可以使用dplyr中的
case_when
来代替嵌套的ifelse
语句:旧答案:
对于因子或特征向量,我们可以使用
plyr
中的revalue
:这样做的好处是只指定一次输入向量,因此我们可以使用类似
lb3vh1jj4#
要替换多个号码:
对于一个连续的序列,你可以这样做
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)
,我们可以用一个值代替多个值。roqulrg35#
为什么这么大惊小怪?
演示:
rqqzpn5f6#
ifelse
函数将是一种快速简便的方法。vktxenjb7#
如果你想一次替换很多值,你可以使用"library(car)"。
cbeh67ev8#
如果有人正在寻找
replace
的替代品,case_match
是case_when
的一个简单变体,可以在向量上工作。它还可以用于多个替换: