web-dev-qa-db-ja.com

R:パイプ内のいくつかのgsub()関数を組み合わせる

いくつかの厄介なデータをクリーンアップするために、パイプ_%>%_の使用を開始したいのですが、gsub()がパイプの先頭にない場合、Rコードを機能させることができません(注:この質問は、適切なインポートではなく、データのクリーニングに関係しています)。

簡単な例:

_df <- cbind.data.frame(A= c("2.187,78 ", "5.491,28 ", "7.000,32 "), B = c("A","B","C"))
_

列Aには文字(この場合は数字ですが、文字列の場合もあります)が含まれているため、クリーンアップする必要があります。手順は次のとおりです

_df$D <- gsub("\\.","",df$A)
df$D <- str_trim(df$D) 
df$D <- as.numeric(gsub(",", ".",df$D))
_

これを簡単にパイプできます

_df$D  <-  gsub("\\.","",df$A) %>%
          str_trim() %>%
          as.numeric(gsub(",", ".")) %>%
_

問題は2番目のgsubです。これは、実際には前の行の結果である入力を要求するためです。

パイプラインのさらに下流でgsub()のような関数を使用する方法を誰かが説明できますか?どうもありがとう!

システム:R 3.2.3、W​​indows

9
user2006697

通常、このようにパイプをデータフレーム全体に適用して、クリーンアップされたデータフレームを返します。関数型プログラミングの考え方は、オブジェクトは不変であり、その場で変更されるのではなく、新しいオブジェクトが生成されるというものです。

library(dplyr)

df %>%
   mutate(C = gsub("\\.", "", A)) %>%
   mutate(C = gsub(",", ".", C)) %>%
   mutate(C = as.numeric(C))

また、これらの代替手段が機能することにも注意してください。

df %>% mutate(C = gsub("\\.", "", A), C = gsub(",", ".", C), C = as.numeric(C))


df %>% mutate(C = read.table(text = gsub("[.]", "", A), dec = ",")[[1]])


df %>% mutate(C = type.convert(gsub("[.]", "", A), dec = ","))

この特定の例ではtype.convertは、私たちがやろうとしていることを高レベルでコンパクトに表現しているので、最も適切だと思われます。比較すると、gsub/as.numericソリューションは低レベルで冗長に見えますが、read.tableはdata.frameに変換を追加しますが、元に戻す必要があるため、高レベルになりすぎます。

8
G. Grothendieck

問題は、パイプに供給される引数が引数のリストの最初である必要があるということです。ただし、xは3番目であるため、これはgsub()には当てはまりません。 (簡単な)回避策は次のとおりです。

df$A %>% 
  gsub(pattern = "\\.", replacement="") %>%
  str_trim() %>%
  gsub(patter = ",", replacement = ".") %>%
  as.numeric
3
ddiez

パッケージstringrstr_replace(string, pattern, replacement)gsubのドロップイン置換として使用できます。 。ストリンガー関数は、文字列/文字ベクトルが最初の引数である整然としたアプローチに従います。

c("hello", "hi") %>% str_replace_all("[aeiou]", "x")

Rのデフォルトの文字列関数の代わりとしての、ストリンガーの適切な名前と定義の関数の詳細については、 stringrの概要 を参照してください。

1
qwr