40

ある値のすべての出現箇所を別の値に置き換える関数を探しています。たとえば、すべてのゼロを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しかし、他の一般的に使用されているパッケージの代わりに、できればパッケージから、この仕事をするための標準的な機能があるかどうか疑問に思っています。このような標準を使用すると、コードが読みやすくなる可能性が高く、必要な場所でその関数を再定義する必要はないと思います。

4

7 に答える 7

79

おそらく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))
于 2012-07-31T10:02:25.333 に答える
18

もう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
于 2012-07-31T10:13:40.650 に答える
4

これを行う簡単な方法ifelseは、ベクトル化されたを使用することです。条件が満たされている場合は置換値を使用し、満たされていない場合は元の値を使用します。

v <- c(3, 2, 1, 0, 4, 0)
ifelse(v == 0, 1, v)

パイプを使用することで、名前付き変数を回避できます。

c(3, 2, 1, 0, 4, 0) %>% ifelse(. == 0, 1, .)

一般的なタスクは、複数の置換を行うことです。ifelseネストされたステートメントの代わりに、case_whenfrom dplyrを使用できます:

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

古い答え:

revalue因子または文字ベクトルの場合、次から使用できますplyr

> revalue(c("a", "b", "c"), c("b" = "B"))
[1] "a" "B" "c"

これには、入力ベクトルを1回だけ指定するという利点があるため、次のようなパイプを使用できます。

x %>% revalue(c("b" = "B"))
于 2018-11-11T22:12:52.593 に答える
3

複数の番号を置き換えるには:

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)、複数の値を1つの値に置き換えることができます。

于 2015-06-15T05:42:21.200 に答える
3

なぜ大騒ぎ?

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"
于 2019-02-27T09:25:59.770 に答える
1

このifelse関数は、これを行うための迅速で簡単な方法です。

于 2012-07-31T15:55:55.870 に答える
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
于 2020-05-03T10:49:36.573 に答える