我正在寻找一个函数,它将所有出现的一个值替换为另一个值.例如,我想将所有零替换为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)
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)
一个简单的方法是使用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)