2017-07-31 865 views
0

我想檢查數據框中的幾百個變量,找出其中哪些變量包含非ASCII字符,以便我可以將SPSS數據集數據集來自SPSS(.sav),我使用外部包和read.spss(文件名,to.data.frame = TRUE)在R中讀取它。現在我想write.dta將我的數據框放回到stata中。但我得到的錯誤:自動檢查R中非常長的變量列表中的非ASCII字符

In abbreviate(ll, 80L) : abbreviate used with non-ASCII chars

由於喬希奧布萊恩以下後響應:"Removing non-ASCII characters from data files",我可以用自己的代碼在時間非ASCII字符來檢查一個變量。

## Do any lines contain non-ASCII characters? 
any(grepl("I_WAS_NOT_ASCII", iconv(x, "latin1", "ASCII", sub="I_WAS_NOT_ASCII"))) 
[1] TRUE 

然後在非ASCII字符的位置檢查其爲TRUE的任何變量內。

## Find which lines (e.g. read in by readLines()) contain non-ASCII characters 
grep("I_WAS_NOT_ASCII", iconv(x, "latin1", "ASCII", sub="I_WAS_NOT_ASCII")) 
[1] 1 2 3 

是否有使用R中這些功能可以一次檢查多個「X」 S /變量/特徵向量,並返回包含非ASCII字符變量列表的方式,也可以僅是用循環完成?更方便的方法是告訴R將數據框中的所有非ASCII字符轉換爲與ASCII兼容的東西,以便將其寫入stata中。到目前爲止,我可以設想使用hadley's answer to the same post referenced above,我將需要將每個變量分別轉換爲ascii兼容的字符串變量,並將其添加到我的數據集中,然後刪除違規變量。

回答

0

擴展在代碼哈德利的答案:

library('stringi') 
library('dplyr') 

# simulating an example 
x <- c("Ekstr\u00f8m", "J\u00f6reskog", "bi\u00dfchen Z\u00fcrcher") 

df <- data.frame(id = 1:3, 
       logi = c(T, T, F), 
       test = x, 
       test2 = rev(x), 
       test_norm = c('Everything', 'is', 'perfect')) 
# added several non-character columns to show that they are not affected 
# Now translating every character column to ASCII 

df2 <- df %>% 
    mutate_if(is.character, 
     stri_trans_general, 
     id = "latin-ascii") 

df2 

    id logi    test   test2 test_norm 
1 1 TRUE   Ekstrom bisschen Zurcher Everything 
2 2 TRUE   Joreskog   Joreskog   is 
3 3 FALSE bisschen Zurcher   Ekstrom perfect 

當然它會與拉丁美洲只工作到ASCII。

+0

這非常靈活。我們可以將if語句改爲if.integer或if.factor等等......對於其他類型的變量 - 奇怪的是,即使它們有文本/字符響應,我的很多變量仍然以整數形式存儲。同樣使用「stri_enc_toascii(x)」而不是「stri_trans_general」可用於更廣泛的案例。再一步,就是如何使用這個「變異」數據來覆蓋舊的變量。當我查看()我的數據時,它仍然顯示未經轉換的數據。我不知道如何做到這一點,但也許值得一個單獨的問題。 – solnza

+0

@solnza編輯將新的'data.frame'分配給'df2'。使用管道運算符('%>%')expresiion'x%>%str()'與'str(x)'類似。這一切都在'help('%>%')'中解釋。 'stri_trans_toascii()'與'stri_trans_general()'有點不同,所以可以隨意選擇更合適的一個。 –