2012-07-05 59 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

相關問題