在R中的特定字符串之前提取整数(不同长度)

时间:2012-12-15 15:59:55

标签: r

我试图从已知字符串之前的数据框列($ description)中提取不同长度的整数。例如,我希望提取出现在字符串“yard”之前的整数(每行代表dataframe列中的一个单独的条目):

(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推进了17码(K.Phillips)。

使问题的原因是整数的长度可以变化(即4或17),但它也可以是负的。

我真的已经尝试了我能想到的一切,并且一整天都在寻找相关的线索!

3 个答案:

答案 0 :(得分: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]+,其中一些可能位于-之前,后面跟着...
  • ......任何.*$,到输入的末尾。

括号用于“反向引用”。您会注意到上面的示例中有三个组,我们只对第二组的结果感兴趣,因此\\2作为替代。

答案 1 :(得分: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建议的那样一步到位!

答案 2 :(得分: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))))