xlsx
パッケージが日付を誤って読み取っています。私はここでよく似たQをすべて読み、インターネット上でスカウトをしましたが、列に日付以外のデータがある場合にOriginが変更されるこの特定の動作を見つけることができません。
ドロップボックスから取得できる小さなExcelスプレッドシートがあります。
https://www.dropbox.com/s/872q9mzb5uzukws/test.xlsx
3つの行と2つの列があります。最初は日付、2番目は数字です。 3行目は、日付列に「総計」があります。
最初の2行を_read.xlsx
_で読み取り、最初の列が日付であると言うと、これは機能します。
_read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("Date","integer"),endRow=2)
X1 X2
1 2014-06-29 49
2 2014-06-30 46
_
それらは確かにスプレッドシートの日付です。 3つの行すべてを読み取ってみると、何かがうまくいきません。
_read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("Date","integer"))
X1 X2
1 2084-06-30 49
2 2084-07-01 46
3 <NA> 89251
Warning message:
In as.POSIXlt.Date(x) : NAs introduced by coercion
_
整数として読み込もうとすると、異なる整数が得られます。
_> read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("integer","integer"),endRow=2)
X1 X2
1 16250 49
2 16251 46
> read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("integer","integer"))
X1 X2
1 41819 49
2 41820 46
3 NA 89251
_
最初の整数はas.Date(s1$X1,Origin="1970-01-01")
(Unix Epoch)を使用して正しく変換され、2番目の整数はas.Date(s2$X1, Origin="1899-12-30")
(Excel Epoch)を使用して正しく変換されます。 1970を使用して2番目のロットを変換すると、2084の日付が取得されます。
だから:私は何か間違ったことをしていますか?整数として読み取るのが最善であり、NAがある場合はExcel Epochを使用して変換し、そうでない場合はUnixエポックを使用しますか?それともxlsx
パッケージのバグですか?
xlsxバージョンはバージョン:0.5.1です
日付は整数として読み取ることができ、後でopenxlsx::convertToDate()
関数を使用して日付に変換できます。
もっと ここ
XLConnect
は、このかなり甘いものを処理できます。
test <- readWorksheetFromFile( "~/Downloads/test.xlsx", sheet = "Sheet1", header = FALSE )
test
Col1 Col2
1 2014-06-29 00:00:00 49
2 2014-06-30 00:00:00 46
3 Grand Total 89251
あなたが抱えている問題は明らかです。最初の列が混合タイプであるということです:character
とPOSIXct
。 XLConnect
は各セルを正しく読み取ることができますが、列のすべてのセルを最も一般的なタイプ(この場合はcharacter
)にキャストします。
str(test)
'data.frame': 3 obs. of 2 variables:
$ Col1: chr "2014-06-29 00:00:00" "2014-06-30 00:00:00" "Grand Total"
$ Col2: num 49 46 89251
あなたが抱えている問題は、Excelが1月から1900年までの日数を保存していることです。つまり、RがExcelファイルから読み取っている日数です。 Rで変換すると、1月1日から1970年までの日数に基づいて変換されます。最初にこれら2つの間の日数を引くと、うまくいくはずです。