0

我正在解决一个问题,其中我必须有两个数据框数据和缩写,我想将数据中存在的所有缩写替换为它们各自的完整形式。到目前为止,我一直for-loops在以下列方式使用

abb <- c()
for(i in 1:length(data$text)){
  for(j in 1:length(AbbreviationList$Abb)){
    abb <- paste("(\\b", AbbreviationList$Abb[j], "\\b)", sep="")
    data$text[i] <- gsub(abb, AbbreviationList$Fullform[j], tolower(data$text[i]))
  }
}

缩写数据框类似于下图,可以使用以下代码生成

在此处输入图像描述

Abbreviation <- c(c("hru", "how are you"), 
                  c("asap", "as soon as possible"), 
                  c("bf", "boyfriend"), 
                  c("ur", "your"), 
                  c("u", "you"),
                  c("afk", "away from keyboard"))
Abbreviation <- data.frame(matrix(Abbreviation, ncol=2, byrow=T), row.names=NULL)

名称(缩写)<- c(“abb”,“Fullform”)

并且数据只是一个数据框,其中 1 列在每行中都有文本字符串,也可以使用以下代码生成。

在此处输入图像描述

data <- data.frame(unlist(c("its good to see you, hru doing?", 
                            "I am near bridge come ASAP",
                            "Can u tell me the method u used for",
                            "afk so couldn't respond to ur mails",
                            "asmof I dont know who is your bf?")))
names(data) <- "text"

最初,我有大约 1000 个观察值和大约 100 个缩写的数据框。因此,我能够运行分析。但现在数据已增加到近 50000 个,我在处理它时遇到了困难,因为有两个for-loops这使得处理过程非常缓慢。您能否建议一些更好的替代方案for-loop并举例说明如何在这种情况下使用它。如果这个问题可以通过矢量化方法更快地解决,那么请建议如何做到这一点。

谢谢您的帮助!

4

2 回答 2

1

这应该更快,并且没有副作用。

mapply(function(x,y){
  abb <- paste0("(\\b", x, "\\b)")
  gsub(abb, y, tolower(data$text))
},abriv$Abb,abriv$Fullform)
  1. gsub是矢量化的,所以不给它一个寻找匹配项的字符向量。这里我给它 data$text
  2. 我用它mapply来避免for.
于 2013-07-17T09:31:54.243 回答
1

首先,显然没有必要在循环的每次迭代中编译正则表达式。此外,实际上不需要循环data$text:在 R 中,您通常可以使用值可以执行的向量——R 将遍历向量的所有元素并返回相同长度的向量。

Abbreviation$regex <- sprintf( "(\\b%s\\b)", Abbreviation$abb )

for( j in 1:length( Abbreviation$abb ) ) {
    data$text <- gsub( Abbreviation$regex[j], 
                       Abbreviation$Fullform[j], data$text,
                       ignore.case= T )
 }

上面的代码适用于示例数据。

于 2013-07-17T08:41:28.770 回答