替换R data.frames中的单词(文本挖掘)
我正在使用SQL和R开发一个文本挖掘解决方案 首先,我从我的SQL选择中将数据导入R,然后用它进行数据挖掘 以下是我得到的:替换R data.frames中的单词(文本挖掘),r,replace,dataframe,gsub,R,Replace,Dataframe,Gsub,我正在使用SQL和R开发一个文本挖掘解决方案 首先,我从我的SQL选择中将数据导入R,然后用它进行数据挖掘 以下是我得到的: rawData = sqlQuery(dwhConnect,sqlString) a = data.frame(rawData$ENNOTE_NEU) 如果我做一个 a[[1]][1:3] 您可以看到结构: [1] lorem ipsum li ld ee wö wo di dd [2] la kdin di da dogs chicken [3] kd good
rawData = sqlQuery(dwhConnect,sqlString)
a = data.frame(rawData$ENNOTE_NEU)
如果我做一个
a[[1]][1:3]
您可以看到结构:
[1] lorem ipsum li ld ee wö wo di dd
[2] la kdin di da dogs chicken
[3] kd good i need some help
现在我想用我自己的字典做一些数据清理。
例如,将li替换为lorem ipsum和kd以及kdin替换为kunde
我的问题是如何对整个数据帧执行此操作
for(i in 1:(nrow(a)))
{
a[[1]][i]=gsub( " kd | kdin " , " kunde " ,a[[1]][i])
a[[1]][i]=gsub( " li " , " lorem ipsum " ,a[[1]][i])
...
}
工作正常,但对于大量数据来说速度较慢
有更好的方法吗
干杯队长
gsub
是矢量化的,所以你不需要循环
a[[1]] <- gsub( " kd | kdin " , " kunde " , a[[1]])
a[[1]]gsub
是矢量化的,因此不需要循环
a[[1]] <- gsub( " kd | kdin " , " kunde " , a[[1]])
a[[1]]替代方法:完全避免正则表达式。当你有很多不同的词要搜索时,这种方法效果最好,因为除了第一次,你可以避免文本操作
a1 <- c("lorem ipsum li ld ee wö wo di dd","la kdin di da dogs chicken","kd good i need some help")
x <- strsplit(a1, " ",fixed=TRUE) # fixed option avoids regexes which will be slower
replfxn <- function(vec,word.in,word.out) {
vec[vec %in% word.in] <- word.out
vec
}
word.in <- "kdin"
word.out <- "kunde"
replfxn(x[[2]],word.in,word.out)
lapply(x,replfxn,word.in=word.in,word.out=word.out)
[[1]]
[1] "lorem" "ipsum" "li" "ld" "ee" "wö" "wo" "di" "dd"
[[2]]
[1] "la" "kunde" "di" "da" "dogs" "chicken"
[[3]]
[1] "kd" "good" "i" "need" "some" "help"
替代方法:完全避免正则表达式。当你有很多不同的词要搜索时,这种方法效果最好,因为除了第一次,你可以避免文本操作
a1 <- c("lorem ipsum li ld ee wö wo di dd","la kdin di da dogs chicken","kd good i need some help")
x <- strsplit(a1, " ",fixed=TRUE) # fixed option avoids regexes which will be slower
replfxn <- function(vec,word.in,word.out) {
vec[vec %in% word.in] <- word.out
vec
}
word.in <- "kdin"
word.out <- "kunde"
replfxn(x[[2]],word.in,word.out)
lapply(x,replfxn,word.in=word.in,word.out=word.out)
[[1]]
[1] "lorem" "ipsum" "li" "ld" "ee" "wö" "wo" "di" "dd"
[[2]]
[1] "la" "kunde" "di" "da" "dogs" "chicken"
[[3]]
[1] "kd" "good" "i" "need" "some" "help"
可能是一个尝试的选项:直接在SQL中执行此操作,或者从R调用SQL命令?到目前为止,SQL和gsub的想法很好。如果速度至关重要,您还可以在Rcpp中编写自定义函数。可以尝试这样做:直接在SQL中执行此操作,或者从R调用SQL命令?到目前为止,SQL和gsub的想法很好。如果速度至关重要,您还可以在Rcpp中编写一个自定义函数。对于干净的矢量化解决方案,+1。如果您想对多个列执行此操作,可以使用apply(a,2,函数(x)gsub(“kd | kdin”,“kunde”,x))
。谢谢<代码>应用(a,2,函数(x)gsub(“kd | kdin”,“kunde”,x))
成功了。正则表达式中的空格是必需的,因为否则类似makd的内容将被转换为makunde。我有一个巨大的语料库要处理,所以问题将是巨大的。对于一个干净的矢量化解决方案+1。如果您想对多个列执行此操作,可以使用apply(a,2,函数(x)gsub(“kd | kdin”,“kunde”,x))
。谢谢<代码>应用(a,2,函数(x)gsub(“kd | kdin”,“kunde”,x))
成功了。正则表达式中的空格是必需的,因为否则类似makd的内容将被转换为makunde。我有一个庞大的语料库要处理,所以问题将是巨大的。你是对的。我尝试过拉普利,也有同样的经历。原来我的循环太耗时了。你说得对。我尝试过拉普利,也有同样的经历。结果证明我的循环非常耗时。