精華區beta R_Language 關於我們 聯絡資訊
[問題類型]: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) [軟體熟悉度]: 請把以下不需要的部份刪除 入門(寫過其他程式,只是對語法不熟悉) [問題敘述]: 我目前用RPostgreSQL把資料庫的資料抓下來,但是只要是中文的欄位都變成亂碼 我想用比較簡單的方法把UTF8轉成big5 [程式範例]: df$addr <- iconv(df$addr, "UTF8", "big5") 如上述,我目前是用iconv一個一個轉,想請問一下我要怎麼把迴圈寫進$之後 或是可以告訴我關鍵字或概念 或是有沒有更簡便的方法 [環境敘述]: 請提供 sessionInfo() 的輸出結果, 裡面含有所有你使用的作業系統、R 的版本和套件版本資訊, 讓版友更容易找出錯誤 [關鍵字]: 選擇性,也許未來有用 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.23.167.43 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1492142292.A.C75.html
chitaiwar: df$addr <- sapply(df$addr, function(x) iconv(x, 04/14 12:04
chitaiwar: 'UTF8', 'big5')) 小弟不才 嘗試解 有錯請指正 04/14 12:06
cywhale: 何不試試看抓資料回來時就讓它是正確的編碼?也許可行 04/14 12:16
cywhale: dbGetQuery(conn, "set client_encoding to 'Big5'") 04/14 12:16
cywhale: then dbReadTable(conn, "YourTableName") 04/14 12:17
Wush978: 用`[[`, ex: df[["addr"]] 04/14 13:30
joedenkidd: 這樣單欄可處理 df$addr,想請問要如何處理整個導進來 04/14 13:56
joedenkidd: 的table? 04/14 13:56
RogerHsieh99: for i in c(1:length(df)){ 04/14 14:15
RogerHsieh99: df[i] <- iconv(df[i], "UTF8", "big5")} 04/14 14:15
RogerHsieh99: 小弟也是新手,不曉得有沒有解決到你的問題 04/14 14:16
joedenkidd: for(x in c(1:16)){ res[[x]]=iconv(res[[x]],"UTF8" 04/14 14:37
joedenkidd: ,"CP950") } 04/14 14:37
celestialgod: data.table: DT[ , lapply(.SD, function(x){ 04/14 22:19
celestialgod: iconv(x,"UTF8", "BIG5")}] 04/14 22:20
celestialgod: dplyr: DF %>% mutate_each(funs(iconv(., "UTF8", 04/14 22:20
celestialgod: "BIG5"))) 04/14 22:21
celestialgod: 如果要限定character column可以使用 mutate_if 04/14 22:21
celestialgod: DF %>% mutate_if(is.character, funs(iconv(., 04/14 22:23
celestialgod: "UTF8", "BIG5"))) 04/14 22:23
celestialgod: 我應該回一篇文章的Orz 04/14 22:23
> -------------------------------------------------------------------------- < 作者: celestialgod (天) 看板: R_Language 標題: Re: [問題] 要如何將$之後字串用迴圈寫 時間: Fri Apr 14 22:50:38 2017 ※ 引述《jklkj (誠實可靠小郎君)》之銘言: : [問題類型]: : : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) : : [軟體熟悉度]: : 請把以下不需要的部份刪除 : 入門(寫過其他程式,只是對語法不熟悉) : [問題敘述]: : : 我目前用RPostgreSQL把資料庫的資料抓下來,但是只要是中文的欄位都變成亂碼 : 我想用比較簡單的方法把UTF8轉成big5 : : [程式範例]: : : df$addr <- iconv(df$addr, "UTF8", "big5") : 如上述,我目前是用iconv一個一個轉,想請問一下我要怎麼把迴圈寫進$之後 : 或是可以告訴我關鍵字或概念 : 或是有沒有更簡便的方法 : 提醒:下面程式沒有判斷factor,如有factor請自行加入判斷式 # data.table做法: library(data.table) DT[ , lapply(.SD, function(x)iconv(x,"UTF8", "BIG5"))] # 如果有numeric或是integer column的話: DT[ , lapply(.SD, function(x){ if (is.character(x)) iconv(x,"UTF8", "BIG5") } else return(x)})] # dplyr做法: library(dplyr) DF %>% mutate_each(funs(iconv(., "UTF8", "BIG5"))) # 如果有numeric或是integer column的話: DF %>% mutate_if(is.character, funs(iconv(., "UTF8", "BIG5"))) # base函數解法: evalExpr <- lapply(names(DF), function(x){ bquote(iconv(.(as.symbol(x)), "UTF8", "BIG5")) }) do.call(function(...) transform(DF, ...), evalExpr) # 如果有numeric或是integer column的話: evalExpr <- lapply(names(DF)[sapply(DF, is.character)], function(x) bquote(iconv(.(as.symbol(x)), "UTF8", "BIG5"))) do.call(function(...) transform(DF, ...), evalExpr) base函數解法應該是最難的XDD base當然還可以用其他大大提到的方式直接做: lapply(names(DF), function(x){ iconv(DF[[x]], "UTF8", "BIG5") }) 或是 lapply(names(DF)[sapply(DF, is.character)], function(x){ iconv(DF[[x]], "UTF8", "BIG5") }) 只是除了要多轉一次data.frame之外,第二個還要把numeric, integer column併回去 -- R資料整理套件系列文: magrittr #1LhSWhpH (R_Language) https://goo.gl/72l1m9 data.table #1LhW7Tvj (R_Language) https://goo.gl/PZa6Ue dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/I5xX9b tidyr #1Liqls1R (R_Language) https://goo.gl/i7yzAz pipeR #1NXESRm5 (R_Language) https://goo.gl/zRUISx -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.246.26.70 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1492181442.A.5B4.html ※ 編輯: celestialgod (111.246.26.70), 04/14/2017 22:59:42 ※ 編輯: celestialgod (111.246.26.70), 04/14/2017 23:10:26