解析R中的字符串
我想在数据帧中解析R中的字符向量,该数据帧的构造与下面的数据帧类似:解析R中的字符串,r,parsing,char,expression,R,Parsing,Char,Expression,我想在数据帧中解析R中的字符向量,该数据帧的构造与下面的数据帧类似: a <- c("abc def. ghi jkl mno pqr", "stu vwx.", "yza bcd. efg hij mno klm", " nop qrs.", "tuv wxy.") b <- c(TRUE, FALSE, TRUE, FALSE, FALSE) df <- as.data.frame(cbind(a, b)) df$a <- as.character(df$a) df$
a <- c("abc def. ghi jkl mno pqr", "stu vwx.", "yza bcd. efg hij mno klm", " nop qrs.", "tuv wxy.")
b <- c(TRUE, FALSE, TRUE, FALSE, FALSE)
df <- as.data.frame(cbind(a, b))
df$a <- as.character(df$a)
df$b <- as.logical(df$b)
df
a b
1 abc def. ghi jkl mno pqr TRUE
2 stu vwx. FALSE
3 yza bcd. efg hij mno klm TRUE
4 nop qrs. FALSE
5 tuv wxy. FALSE
> str(df)
'data.frame': 5 obs. of 2 variables:
$ a: chr "abc def. ghi jkl mno pqr" "stu vwx." "yza bcd. efg hij mno klm" " nop qrs." ...
$ b: logi TRUE FALSE TRUE FALSE FALSE
我已经能够使用以下方法提取两个关键字之间的单词:
df$c <- ifelse(df$b == TRUE, str_sub(str_extract(df$a, "(?<=\\bdef).+?.(\\bmno)")), NA)
df
a b
1 abc def. ghi jkl mno pqr TRUE
2 stu vwx. FALSE
3 yzab cdef. ghi jkl mno mnop TRUE
4 qrs tuv. FALSE
5 wxy zab. FALSE
c
1 . ghi jkl mno
2 <NA>
3 <NA>
4 <NA>
5 <NA>
虽然这在过去对我有效,但在这里它似乎只是返回了
mno
之前的所有内容。过去我还可以使用start=
和end=
来修剪结果,但这里我需要计算单词,而不是字符,以利用这种方法。有没有办法通过计算单词而不是计算字符来修剪我的结果?我们可以使用sub
来匹配字符(*
),捕获单词的两个实例,后跟零个或多个空格,作为一个组,后跟空格和“mno”,然后替换为反向引用,在ifelse
中使用此选项可使用NA设置假值
df$c <- with(df, ifelse(b, sub(".*\\b(\\w+\\s+\\w+)\\s+mno\\b.*", "\\1", a), NA))
df$c
#[1] "ghi jkl" NA "efg hij" NA NA
我们可以使用
sub
来匹配字符(*
),捕获两个单词实例,后跟零个或多个空格,作为一个组,后跟空格和“mno”,然后替换为反向引用,在ifelse
中使用此项将假值替换为NA
df$c <- with(df, ifelse(b, sub(".*\\b(\\w+\\s+\\w+)\\s+mno\\b.*", "\\1", a), NA))
df$c
#[1] "ghi jkl" NA "efg hij" NA NA
如果存在正则表达式匹配时,
b
为真,则存在transform(df,c=sapply(regmatches(a,regexec(.*(\\w+\\w+mno.*),a)),`[`,2))
如果存在正则表达式匹配时,b
为真,则存在transform(df,c=sapply(regmatches(a,regexec(.*(\\w+\\w+\\mno.*),a)),`2))
谢谢你的帮助@Frank
和@akun
。我很感激你的见解。但是,我似乎得到了与你不同的结果:>df$c df$c[1]“jkl”NA“hij”NA-NA
。你知道为什么我只得到了两个单词中的第二个吗?@Frank的解决方案在我的样本数据集上起作用;但是,在我的真实数据集上,我得到了以下错误:错误:“transform(superbowl,superbowl$Fumbler=”中的意外“=”
wheredf==superbowl
和df$c==superbowl$Fumbler
。感谢您的帮助!@dataprephetors不知道发生了什么。我将我的第一个选项编辑为一个紧凑的选项(如果我记得它起作用的话-您是否以任何方式更改了示例)?我又回到了早期的正则表达式。它正在为示例工作感谢你的帮助@Frank
和@akun
。我感谢你的见解。但是,我似乎得到了与你不同的结果:>df$c df$c[1]“jkl”NA“hij”NA-NA
。你知道为什么我只得到了两个单词中的第二个吗?@Frank的解决方案在我的样本数据集上起作用;但是,在我的真实数据集上,我得到了以下错误:错误:“transform(superbowl,superbowl$Fumbler=”中的意外“=”
wheredf==superbowl
和df$c==superbowl$Fumbler
。谢谢你的帮助!@dataprephetors不知道发生了什么。我将我的第一个选项编辑成了一个紧凑的选项(如果我记得它起作用的话-你是否以任何方式更改了你的示例)?。我恢复到了早期的正则表达式。它对示例起作用
> df$c <- ifelse(df$b == TRUE, gsub("(\\w+\\s)*(\\w+)\\smno.*","\\1\\2", df$a), NA)
> df
a b
1 abc def. ghi jkl mno pqr TRUE
2 stu vwx. FALSE
3 yzab cdef. ghi jkl mno mnop TRUE
4 qrs tuv. FALSE
5 wxy zab. FALSE
c
1 abc def. ghi jkl
2 <NA>
3 yzab cdef. jkl mno
4 <NA>
5 <NA>
df$c <- with(df, ifelse(b, sub(".*\\b(\\w+\\s+\\w+)\\s+mno\\b.*", "\\1", a), NA))
df$c
#[1] "ghi jkl" NA "efg hij" NA NA
with(df, replace(sub(".*\\b(\\w+\\s+\\w+)\\s+mno\\b.*", "\\1", a), !b, NA))