4

私は R を初めて使用し、空のエントリを持つベクトルを使用していますが、grep が私のデータに対して直感に反する動作をすることに気付きました。説明する方法が 100% わからないので、例を使用して作業します。3 つのベクトルがあるとします。

A<-c("","","","","","","a")
B<-c(NA,NA,NA,NA,NA,NA,"a")

Aデータが最初に保存された方法であり、BRがデータを読み取っている方法です。> vec[grep("",vec, invert=TRUE)]私の理解では、実行するvecと、すべての空のセルが検索され、それらのインデックスが返され、空でないデータ エントリを含む結果ベクトルが入力されて表示されます。ただし、これを実行するvec=Aと、次のvec=Bようになります。

vec = A:

> A[grep("",A, invert=FALSE)]
[1] "" "" "" "" "" "" "" "a" 
> A[grep("",A, invert=TRUE)]
character(0)

vec = B:

> B[grep("",B, invert=FALSE)]
[1] "a"
> B[grep("",B, invert=TRUE)]
[1] NA NA NA NA NA NA

私のデータはケースのように読み取られていると思っていたので、BI は直感に反する結果に困惑しました。これは単に変数タイプの問題である可能性があることは理解していますが、何が起こっているのかについて誰かが状況をさらに明らかにできるかどうか疑問に思っていました.

簡易編集ケース A は理にかなっています。変数の型がオフになっているため、grep は "" を見つけることができないため、すべてを返します。反転すると、「何もない」のデフォルトとして character(0) が返されます。ケースBでまだ混乱しています。

4

2 に答える 2

8

は正規表現検索をgrep実行することに注意してください(文字列の一致ではありません)。

入力した正規表現""emptyであるため、実行すると、文字列が""に完全に一致するかどうかではなく、grep一致する文字列に が含まれているかどうかが尋ねられます。 ""

例えば、

grepl("a","bananas")

TRUE"a" は"bananas"あるため、返されます。

文字列全体をに対して一致させたい場合""は、正規表現で「^」と「$」を使用できます (「^」は文字列の開始を意味し、「$」は文字列の終了を意味します)。

grepl("^$", "") # returns TRUE
grepl("^$", "a") # returns FALSE

ただし、必要な空のセルだけである場合は、正規表現をまったく使用しない方がよいでしょう。

A[A != ""] # returns "a"
B[!is.na(B)] # returns "a"
于 2012-11-20T00:34:14.227 に答える
3

最初の質問:

> A[grep("^$", A)]
[1] "" "" "" "" "" ""
> A[grep("^$", A, invert=TRUE)]
[1] "a"

パターンとしての の使用は""、任意の文字要素をピックアップしています。の使用は"^$"、最初と最後の間に文字がない文字要素の位置をピックアップすることです。

NA が (それ自体でさえも) 何もしないのと同じ"=="ように、 to も NA が一致しません""

于 2012-11-20T00:32:16.307 に答える