Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 替换向量中的给定值_R_Replace - Fatal编程技术网

R 替换向量中的给定值

R 替换向量中的给定值,r,replace,R,Replace,我正在寻找一个函数,它将用另一个值替换所有出现的一个值。 例如,我想用1替换所有的0。 我不想将结果存储在变量中,但希望能够匿名使用向量作为更大表达式的一部分 我知道如何自己编写合适的函数: > vrepl <- function(haystack, needle, replacement) { + haystack[haystack == needle] <- replacement + return(haystack) + } > > vrepl(c(

我正在寻找一个函数,它将用另一个值替换所有出现的一个值。 例如,我想用1替换所有的0。 我不想将结果存储在变量中,但希望能够匿名使用向量作为更大表达式的一部分

我知道如何自己编写合适的函数:

> 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
>vrepl vrepl(c(3,2,1,0,4,0),0,1)
[1] 3 2 1 1 4 1

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

也许
replace
就是您想要的:

> x = c(3, 2, 1, 0, 4, 0)
> replace(x, x==0, 1)
[1] 3 2 1 1 4 1
或者,如果您没有
x
(有没有具体原因?)

许多人都熟悉
gsub
,因此您也可以尝试以下任一方法:

as.numeric(gsub(0, 1, x))
as.numeric(gsub(0, 1, c(3, 2, 1, 0, 4, 0)))
更新 阅读评论后,也许可以选择使用

with(data.frame(x = c(3, 2, 1, 0, 4, 0)), replace(x, x == 0, 1))

另一个更简单的选择是:

 > 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
>x=c(1,1,2,4,5,2,1,3,2)
>x[x==1]x
[1] 0 0 2 4 5 2 0 3 2

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

要替换多个数字:

vec <- 1:10
replace(vec, vec== c(2,6), c(0,9)) #2 and 6 will be replaced by 0 and 9.

vec一个简单的方法是使用
ifelse
,它是矢量化的。如果条件满足,我们使用替换值,否则我们使用原始值

v <- c(3, 2, 1, 0, 4, 0)
ifelse(v == 0, 1, v)
一个常见的任务是进行多次替换。当
fromdplyr时,我们可以使用
case\u,而不是嵌套的
ifelse
语句:

case_when(v == 0 ~ 1,
          v == 1 ~ 2,
          TRUE ~ v)

旧答案:

对于因子或字符向量,我们可以使用
plyr
中的
重新估价

> revalue(c("a", "b", "c"), c("b" = "B"))
[1] "a" "B" "c"
这样做的优点是只需指定一次输入向量,因此我们可以使用类似管道的

x %>% revalue(c("b" = "B"))
为什么大惊小怪

replace(haystack, haystack %in% needles, replacements)
演示:


haystack如果你想在一次过中替换很多值,你可以使用“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
库(车)

x类似于.numeric(gsub(0,1,c(3,2,1,0,4,0))
有用吗?
vec[vec==vec]记住,除非重新赋值,否则这不会改变
x
。不命名
x
的具体原因是表达式计算
x
本身可能相当长。我希望避免使用太多变量来破坏我的名称空间。所以我希望找到一种方法来避免命名向量,或者复制它的表达式
gsub
和它的字符中间层在性能和精度方面也感觉不好,特别是在处理浮点数时。我肯定可以而且应该在我自己的
vrepl
实现中使用
replace
,除非有人能想出一个完全废弃我自己功能的答案。谢谢你指出这一点@MvG,关于:
使用(data.frame(x=c(3,2,1,0,4,0)),替换(x,x==0,1))
?这需要将中间结果保存到一个命名变量,正如我在问题中所说的,这是我想要避免的。@MvG:抱歉,错过了那部分。无论如何,将它保存在一个变量中更容易维护。我必须给出相同的向量两次,一次用于
test
参数,一次作为结果参数,对吗?似乎没有比调用mrdwab建议的
replace
更简单。正确,但您可以将其保存在临时变量中,并只引用两次
ifelse
replace
都可以完成这项工作。+1这实际上比正确的解决方案要好得多,因为它提供了对值应用函数的额外选项。谢谢@Greg Snow!提供一个使用示例会很有帮助。>警告消息:在替换中(vec,vec==c(2,6),c(0,9)):要替换的项目数量不是替换长度的倍数。我将投票支持您在2018年使用
plyr
-一定是在石头下艰难生活:p@MSBerends因为dplyr工作(主要)对于dataframes,我不知道dplyr解决方案。请注意,这个答案假设针和替换件是1对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"
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