59

次のような誕生日のリストがあります。

dob <- c("9/9/43 12:00 AM/PM", "9/17/88 12:00 AM/PM", "11/21/48 12:00 AM/PM")

この変数からカレンダーの日付を取得したいだけです (つまり、空白が最初に出現した後のすべてを削除します)。

これまでに試したことは次のとおりです。

dob.abridged <- substring(dob,1,8)
dob
[1] "9/9/43 1" "9/17/88 " "11/21/48"
dob.abridged <- gsub(" $","", dob.abridged, perl=T)
> dob.abridged
[1] "9/9/43 1" "9/17/88"  "11/21/48"

したがって、私のコードは長さ 6 または 7 のカレンダー日付では機能しますが、長さ 8 では機能しません。長さ 6、7、または 8 のカレンダー日付を処理できる gsub で使用するより効果的な正規表現へのポインターはありますか?

ありがとうございました。

4

5 に答える 5

127

substringは必要ありません。 gsubを使用してください:

gsub( " .*$", "", dob )
# [1] "9/9/43"   "9/17/88"  "11/21/48"

スペース ( )、次に任意の文字 ( )を、文字列の末尾 ( ) まで.任意の回数( ) 使用します。正規表現については、 ?regexを参照してください。*$

于 2013-04-09T06:51:52.757 に答える
17

私はこの種の問題によく使用strsplitしますが、ロマンの答えがいかにシンプルであるかが気に入りました。strsplitRomainのソリューションを答えと比較するのは興味深いと思いました:

strsplit解決策は次のとおりです。

sapply(strsplit(dob, "\\s+"), "[", 1)

microbenchmark パッケージとdob <- rep(dob, 1000)元のデータを使用すると、次のようになります。

Unit: milliseconds
                                    expr       min        lq    median
                   gsub(" .*$", "", dob)  4.228843  4.247969  4.258232
 sapply(strsplit(dob, "\\\\s+"), "[", 1) 14.438241 14.558832 14.634638
        uq       max neval
  4.268029  5.081608  1000
 14.756628 53.344984  1000

Win 7 マシンの明らかな勝者は、gsubRomain の正規表現です。答えと説明ロマンをありがとう。

于 2013-04-09T12:10:13.173 に答える