※ 引述《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并回去