2

既知の文字列の前にあるデータフレーム列($ description)からさまざまな長さの整数を抽出しようとしています。たとえば、次の文字列「yard」の前に表示される整数を抽出したいと思います(各行はデータフレーム列の個別のエントリを表します)。

(3:18)B.Green-Ellis左端からNE 28まで-1ヤード(A.Ross)。

(1:07)(ハドルショットガンなし)B.Green-EllisがNYG 27に4ヤード(C.Blackburn)右ガード。

(14:00)B.Green-Ellisの右端がNYG 33でobを17ヤード(K.Phillips)押しました。

問題となるのは、整数の長さが変化する可能性があることです(つまり、4または17)が、負の値になることもあります。

私は本当に考えられるすべてを試し、関連するスレッドを一日中探していました!

4

3 に答える 3

3

文字列の最後から簡単な正規表現を使用しgsubて作業できます。

temp <- c("(3:18) B.Green-Ellis left end to NE 28 for -1 yards (A.Ross).", 
          "(1:07) (No Huddle Shotgun) B.Green-Ellis right guard to NYG 27 for 4 yards (C.Blackburn).", 
          "(14:00) B.Green-Ellis right end pushed ob at NYG 33 for 17 yards (K.Phillips).")
as.numeric(gsub("^(.*)( [-1-9]+)(.*)$", "\\2", temp))
# [1] -1  4 17

正規表現を見る:

  • ^.*-何にでも一致します...その時点まで...
  • ...スペースにぶつかり、その後に任意の数の数字が続きます。[-0-9]+場合によっては-前に数字が続き、その後に...
  • ...何でも.*$、入力の最後まで。

角かっこは「逆参照」に使用されます。上記の例には3つのグループがあり、2番目のグループの結果にのみ関心があるため、\\2代わりにとして使用します。

于 2012-12-15T16:24:04.340 に答える
2

少し複雑です...しかし、番号の前にスペースがあると仮定すると機能します...番号自体を抽出するための正規表現を取得できませんでした...

# the data...
yards <- c("(3:18) B.Green-Ellis left end to NE 28 for -1 yards (A.Ross).", 
"(1:07) (No Huddle Shotgun) B.Green-Ellis right guard to NYG 27 for 4 yards (C.Blackburn).", 
"(14:00) B.Green-Ellis right end pushed ob at NYG 33 for 17 yards (K.Phillips).")

# handy function from http://r.789695.n4.nabble.com/reverse-string-td2288532.html
strReverse <- function(x) sapply(lapply(strsplit(x, NULL), rev), paste, collapse="")
# remove everything after ' yard'
y1 <- gsub(' *yard.*$', '', yard)
# reverse and remove everything after the space and reverse again
as.numeric(strReverse(gsub(' .*$','', strReverse(y1))))
于 2012-12-15T16:17:49.173 に答える
2

非常に簡単な解決策は

s1 <- "(3:18) B.Green-Ellis left end to NE 28 for -1 yards (A.Ross)."
ss1 <- strsplit(s1, split = " ")[[1]]
as.numeric(ss1[grep("yards", ss1) -1])

これをループに入れて、すべての行に適用する必要があります。

s1 <- "(3:18) B.Green-Ellis left end to NE 28 for -1 yards (A.Ross)."
s2 <- "(1:07) (No Huddle Shotgun) B.Green-Ellis right guard to NYG 27 for 4 yards  (C.Blackburn)."
s3 <- "(14:00) B.Green-Ellis right end pushed ob at NYG 33 for 17 yards (K.Phillips)."

df <- rbind(s1,s2,s3)

splits <- strsplit(df[, 1], split = " ")
sapply(splits, function(z) z[grep("yards", z) - 1])

@joshuaが提案したように、これを1つのステップで実行することもできます。

于 2012-12-15T16:12:29.967 に答える