→ 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