1. ホーム
  2. r

データフレーム内の文字列の出現箇所をすべて置換する

2023-08-21 08:39:33

質問

私は、'<'でコード化された非検出があるデータフレームで作業しています。 時々、'<' の後にスペースがありますが、'<2' や '< 2' などのようにスペースがない場合もあります。 スペースがある場合はすべて削除したいと思います。

data <- data.frame(name = rep(letters[1:3], each = 3), var1 = rep('< 2', 9), var2 = rep('<3', 9))

  name var1 var2 
1    a  < 2   <3
2    b  < 2   <3
3    c  < 2   <3

こんなところにまで

すべての値を抽出して新しい文字列を作ることはできますが、データフレームに戻すことができません。

index <- str_detect(unlist(data), '<')
index <- matrix(index, nrow = 3)

data[index] 
#[1] "< 2" "< 2" "< 2" "<3"  "<3"  "<3" 

replacements <- str_replace_all(data[index], "<[ ]+","<") 
replacements
#[1] "<2" "<2" "<2" "<3" "<3" "<3"

data[index] <- replacements

#Error in `[<-.data.frame`(`*tmp*`, index, value = c("<2", "<2", "<2",  : 
#  unsupported matrix index in replacement

どのように解決するのですか?

もし、あなたが <強い のみ を置き換えたいのであれば "< " (スペース付き) を "<" (スペースなし) にすると lapply をデータフレームの上に置き、その上に gsub で置き換えます。

> data <- data.frame(lapply(data, function(x) {
+                  gsub("< ", "<", x)
+              }))
> data
  name var1 var2
1    a   <2   <3
2    a   <2   <3
3    a   <2   <3
4    b   <2   <3
5    b   <2   <3
6    b   <2   <3
7    c   <2   <3
8    c   <2   <3
9    c   <2   <3