Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.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 data.frames中的单词(文本挖掘)_R_Replace_Dataframe_Gsub - Fatal编程技术网

替换R data.frames中的单词(文本挖掘)

替换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

我正在使用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 i need some help 
现在我想用我自己的字典做一些数据清理。 例如,将li替换为lorem ipsumkd以及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。我有一个庞大的语料库要处理,所以问题将是巨大的。你是对的。我尝试过拉普利,也有同样的经历。原来我的循环太耗时了。你说得对。我尝试过拉普利,也有同样的经历。结果证明我的循环非常耗时。