Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析R中的字符串_R_Parsing_Char_Expression - Fatal编程技术网

解析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$

我想在数据帧中解析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$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=”中的意外“=”
where
df==superbowl
df$c==superbowl$Fumbler
。感谢您的帮助!@dataprephetors不知道发生了什么。我将我的第一个选项编辑为一个紧凑的选项(如果我记得它起作用的话-您是否以任何方式更改了示例)?我又回到了早期的正则表达式。它正在为示例工作感谢你的帮助
@Frank
@akun
。我感谢你的见解。但是,我似乎得到了与你不同的结果:
>df$c df$c[1]“jkl”NA“hij”NA-NA
。你知道为什么我只得到了两个单词中的第二个吗?@Frank的解决方案在我的样本数据集上起作用;但是,在我的真实数据集上,我得到了以下错误:
错误:“transform(superbowl,superbowl$Fumbler=”中的意外“=”
where
df==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))