2012-07-05 61 views
3

是否有预先存在的功能来清理Mechanical Turk的data.frame字符列?下面是它变得挂了线的一个实例:清理Mechanical Turk的文字?

x <- "Duke\U3e32393cs B or C, no concomittant malignancy, ulcerative colitis, Crohn\U3e32393cs disease, renal, heart or liver failure" 

我认为这些都是Unicode字符,但MT没有让我跟他们继续在那里。我明显可以很容易地将这些表达式重新排列,但我使用了一些不错的方法,希望能有更通用的解决方案来删除所有非ascii字符。

编辑

我可以删除编码如下:

> iconv(x,from="UTF-8",to="latin1",sub=".") 
[1] "Duke......s B or C, no concomittant malignancy, ulcerative colitis, Crohn......s disease, renal, heart or liver failure" 

但是,这仍然让我缺乏对使用非UTF8编码为任何元素矢量一个更通用的解决方案。

> dput(vec) 
c("Colorectal cancer patients Duke\U3e32393cs B or C, no concomittant malignancy, ulcerative colitis, Crohn\U3e32393cs disease, renal, heart or liver failure", 
"Patients with Parkinson\U3e32393cs Disease not already on levodopa", 
"hi") 

注意定期文本编码“未知”,它没有转化为在“latin1”,使用的iconv那么简单的解决方案失败。我有一个尝试在下面更细致的解决方案,但我不是很满意。

+0

对测试对象提供dput()不是更好吗?属性将被附加。 – 2012-07-05 14:07:34

+0

@Dwin这是'dput()'的输出。我将它复制/粘贴回R来检查UTF-8编码是否会被保留。 – 2012-07-05 14:12:21

+1

'iconv(x,“UTF-8”,“ASCII”,“。”)'的哪一部分你想更通用?你的意思是你想要一些能够检测当前编码的东西,以防万一它是UTF-8或ASCII之外的东西吗? – 2012-07-05 14:26:02

回答

4

要采取刺在回答我的问题,希望有人有更好的办法,因为我不相信这会处理所有时髦的文字:

sanitize.text <- function(x) { 
    stopifnot(is.character(x)) 
    sanitize.each.element <- function(elem) { 
    ifelse(
     Encoding(elem)=="unknown", 
     elem, 
     iconv(elem,from=as.character(Encoding(elem)),to="latin1",sub="") 
    ) 
    } 
    x <- sapply(x, sanitize.each.element) 
    names(x) <- NULL 
    x 
} 

> sanitize.text(vec) 
[1] "Colorectal cancer patients Dukes B or C, no concomittant malignancy, ulcerative colitis, Crohns disease, renal, heart or liver failure" 
[2] "Patients with Parkinsons Disease not already on levodopa"                    
[3] "hi" 

,并处理MT的功能其他进口怪癖:

library(taRifx) 
write.sanitized.csv <- function(x, file="", ...) { 
    sanitize.text <- function(x) { 
    stopifnot(is.character(x)) 
    sanitize.each.element <- function(elem) { 
     ifelse(
     Encoding(elem)=="unknown", 
     elem, 
     iconv(elem,from=as.character(Encoding(elem)),to="latin1",sub="") 
    ) 
    } 
    x <- sapply(x, sanitize.each.element) 
    names(x) <- NULL 
    x 
    } 
    x <- japply(df=x, sel=sapply(x,is.character), FUN=sanitize.text) 
    colnames(x) <- gsub("[^a-zA-Z0-9_]", "_", colnames(x)) 
    write.csv(x, file, row.names=FALSE, ...) 
} 

编辑

由于缺乏一个更好的地方把这个代码,你可以计算出该特征向量的因素导致,即使上面的功能将不喜欢的东西解决问题:

#' Function to locate a non-ASCII character 
#' @param txt A character vector 
#' @return A logical of length length(txt) 
locateBadString <- function(txt) { 
    vapply(txt, function(x) { 
    class(try(substr(x, 1, nchar(x))))!="try-error" 
    }, TRUE) 
} 

EDIT2

认为这应该工作:

iconv(x, to = "latin1", sub="") 

由于@Masoud在这样的回答:https://stackoverflow.com/a/20250920/636656

相关问题