替换向量中的给定值

MvG*_*MvG 27 replace r

我正在寻找一个函数,它将所有出现的一个值替换为另一个值.例如,我想将所有零替换为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
Run Code Online (Sandbox Code Playgroud)

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

A5C*_*2T1 53

也许replace就是你在寻找的东西:

> x = c(3, 2, 1, 0, 4, 0)
> replace(x, x==0, 1)
[1] 3 2 1 1 4 1
Run Code Online (Sandbox Code Playgroud)

或者,如果你没有x(任何具体原因,为什么不?):

replace(c(3, 2, 1, 0, 4, 0), c(3, 2, 1, 0, 4, 0)==0, 1)
Run Code Online (Sandbox Code Playgroud)

很多人都熟悉gsub,所以你也可以尝试以下任何一种方法:

as.numeric(gsub(0, 1, x))
as.numeric(gsub(0, 1, c(3, 2, 1, 0, 4, 0)))
Run Code Online (Sandbox Code Playgroud)

更新

阅读评论后,也许with是一个选择:

with(data.frame(x = c(3, 2, 1, 0, 4, 0)), replace(x, x == 0, 1))
Run Code Online (Sandbox Code Playgroud)

  • 请记住,除非重新分配,否则不会更改`x`. (5认同)

nic*_*ico 15

另一个更简单的选择是:

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


qwr*_*qwr 5

一个简单的方法是使用ifelse向量化的 base (还有if_elsedplyr 来处理缺失值)。如果满足条件,我们使用替换值,否则我们使用原始值。

v <- c(3, 2, 1, 0, 4, 0)
ifelse(v == 0, 1, v)
Run Code Online (Sandbox Code Playgroud)

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

c(3, 2, 1, 0, 4, 0) %>% ifelse(. == 0, 1, .)
Run Code Online (Sandbox Code Playgroud)

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

case_when(v == 0 ~ 1,
          v == 1 ~ 2,
          TRUE ~ v)
Run Code Online (Sandbox Code Playgroud)

旧答案:

对于因子或字符向量,我们可以使用revaluefrom plyr

> revalue(c("a", "b", "c"), c("b" = "B"))
[1] "a" "B" "c"
Run Code Online (Sandbox Code Playgroud)

这样做的优点是只指定一次输入向量,所以我们可以使用像这样的管道

x %>% revalue(c("b" = "B"))
Run Code Online (Sandbox Code Playgroud)