我试图从已知字符串之前的数据框列($ 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),但它也可以是负的。
我真的已经尝试了我能想到的一切,并且一整天都在寻找相关的线索!
答案 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))))