Re: [問題] 讀入"鴴" "鸊鷉" 等怪字

作者: leo0650 (呂奕)   2015-07-07 23:04:24
※ 引述《helixc (@_2;)》之銘言:
: ※ 引述《celestialgod (攸藍)》之銘言:
: : # readxl套件: (不用JAVA,讀取也比較快,也不會轉換字串為factor)
: : library(readxl)
: : dat = read_excel("birdnames.xls")
: 這邊報告一下... readxl這個套件沒問題,
: 但用dplyr處裡資料的時候就會有問題。
: [code]
: library(readxl)
: library(dplyr)
: fileName = "birdnames.xls"
: #讀取資料
: x = read_excel(fileName)
: #資料讀取輸出正常
: x$c_name[51:52]
: #使用dplyr::select來讀資料,用兩種不同的寫法,一樣都不正常
: y1<-select(x, c_name, Order) ; y1[51:52,]
: y2<- x %>% select(c_name, Order) ; y2[51:52,]
: #使用base::unique來讀取資料,正常
: z<-unique(x$c_name); z[51:52]
: 還不太會貼code以及處裡過程,直接貼圖
: http://imgur.com/7oOVkLm
: 不正常的資料
: Source: local data frame [2 x 2]
: c_name Order
: 1 白嘴潛鳥 51
: 2 小<U+9E0A><U+9DC9> 52
: 正常的資料
: [1] "白嘴潛鳥" "小鸊鷉"
: 如果是package處裡的問題的話,那轉移到非windows系統是無解的吧?
: 只能捨棄dplyr使用*apply來輸出名錄了...
: 可是我還不會用*apply來寫dplyr-like的功能阿Orz
幫忙補充c大第二個連結的方法
https://stat.ethz.ch/pipermail/r-devel/2015-May/071259.html
因為 data.frame 的 `print` method 裡面會通過 format() 轉換,
(如底下function中的 #old# 部分),所以可能有些locale所造成不同的轉換。
`print`函數是generic function,
因此可自定義新 class 及 所對應的 `print` method 來實現略過format(),
或可選擇直接在 global environment 定義新的 `print.data.frame`,
使得不用更改class的情況下,優先用自定義的 method
print.data.frame <- function (x, ..., digits = NULL,
quote = FALSE, right = TRUE, row.names = TRUE)
{
n <- length(row.names(x))
if (length(x) == 0L) {
cat(sprintf(ngettext(n, "data frame with 0 columns and %d row",
"data frame with 0 columns and %d rows", domain = "R-base"),
n), "\n", sep = "")
}
else if (n == 0L) {
print.default(names(x), quote = FALSE)
cat(gettext("<0 rows> (or 0-length row.names)\n"))
}
else {
#old# m <- as.matrix(format.data.frame(x, digits = digits,
#old# na.encode = FALSE))
m <- as.matrix(x)
if (!isTRUE(row.names))
dimnames(m)[[1L]] <- if (identical(row.names, FALSE))
rep.int("", n)
else row.names
print(m, ..., quote = quote, right = right)
}
invisible(x)
}
df <- data.frame(x="黑頸鸊鷉"); df
## x
## 1 黑頸鸊鷉
# 測試原本的 `print`
作者: helixc (@_2;)   2015-07-08 07:26:00
感謝,我研究一下…

Links booklink

Contact Us: admin [ a t ] ucptt.com