1

当每个观察只有一个标记实例时,这里有一些关于使用 rm_between 的有用答案。但是,我有一个数据集,我想在其中提取“”中的内容,并且一些观察结果有多个实例。例如:

新鲜或冷藏的大西洋鲑鱼“Salmo salar”和多瑙河鲑鱼“Hucho hucho”

当我使用这段代码时,

library(qdapRegex)
rf <- data.frame(rm_between_multiple(H2$SE_DESC_EN, c("\"", "\""), c("\"", "\""))) 

它创建了一个数据框,并为之前的同一行

 "Fresh or chilled Atlantic salmon and Danube salmon" 

被退回这是完美的。但是我需要丢失的数据。为了尝试保留它,我将代码稍微更改为:

H3 <- rm_between_multiple(H2$SE_DESC_EN, c("\"", "\""), c("\"", "\""), extract=TRUE) 

用报价单中的数据创建一个列表。返回的同一行是:

c("Salmo salar", " and Danube salmon ", "Hucho hucho", 
  "Salmo salar", " and Danube salmon ", "Hucho hucho") 

其中有引用中的数据,但在引用之间也有一些信息,并且正在重复。我在编程方面相当新,并且想知道是否有一种方法可以编写不包含这些引用之间信息的代码。

4

1 回答 1

0

我认为您不需要rm_between_multiplejust rm_between。使用相同的左右标记似乎也存在正则表达式问题,我不确定这是否是一个错误。现在您可以使用以下内容提取

x <- 'Fresh or chilled Atlantic salmon "Salmo salar" and Danube salmon "Hucho hucho"'

rm_default(
    x, 
    pattern = S("@rm_between", '"'),
    extract=TRUE
)

## [[1]]
## [1] "\"Salmo salar\"" "\"Hucho hucho\""

编辑我认为这是因为默认的正则表达式rm_between不包括左/右边界。这使用以下正则表达式"(?<=\").*?(?=\")"。这种前瞻的使用导致左/右边界不被消耗,因此允许引号可用于:" and Danube salmon ". 这是(IMO)我将解决的错误,但不确定如何解决。

编辑 2我将@hwnd 的回复合并到rm_between. qdapRegex的开发版本。您可以通过以下方式安装开发版本:

if (!require("pacman")) install.packages("pacman"); library(pacman)
p_install_gh("trinker/qdapRegex"); p_load(qdapRegex)

和 ...

rm_between(x, '"', '"', extract = TRUE)

## [[1]]
## [1] "Salmo salar" "Hucho hucho"
于 2015-06-29T16:22:23.563 回答