Re: [問題] 要如何將$之後字串用迴圈寫

作者: celestialgod (天)   2017-04-14 22:50:38
※ 引述《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併回去
作者: jklkj (誠實可靠小郎君)   2017-04-18 17:52:00
最近再來試試,感謝

Links booklink

Contact Us: admin [ a t ] ucptt.com