从Excel到R的平台依赖关系

我正在使用gdata导入xls文件。 我使用as.Date转换date列来转换date

根据as.Date的手册,date起源是平台相关的,所以我决定使用哪个起源

 .origin <- ifelse(Sys.info()[['sysname']] == "Windows", "1899-12-30", "1904-01-01") as.Date(myData$Date, origin=.origin) 

但是,我想知道是否应该考虑读取文件的平台或写入平台。

对于什么是值得的,我目前正在一个没有excel的Linux机器上testing代码,并且正确的date是通过使用origin="1904-01-01"


引用`?as.Date'

  ## date given as number of days since 1900-01-01 (a date in 1989) as.Date(32768, origin = "1900-01-01") ## Excel is said to use 1900-01-01 as day 1 (Windows default) or ## 1904-01-01 as day 0 (Mac default), but this is complicated by Excel ## treating 1900 as a leap year. ## So for dates (post-1901) from Windows Excel as.Date(35981, origin = "1899-12-30") # 1998-07-05 ## and Mac Excel as.Date(34519, origin = "1904-01-01") # 1998-07-05 ## (these values come from http://support.microsoft.com/kb/214330) 

你可以试用(非常)新的exell软件包: https : //github.com/hadley/exell 。 它将加载exceldate到POSIXct中,根据文件是由Windows还是Mac Excel写入来正确select原点。

是的,你应该考虑在哪里文件。 Excel-Windows似乎能够区分Mac写的date与Win-writtendate,但是您得到的证据是这些Mac源文件.xls文件。

最安全的方法是在input数据的Excel版本中工作,并使用格式菜单调出一个对话框,从中selectas-Date和自定义格式为yyyy-mm-dd。 然后保存为csv文件,您将能够将colClasses向量“Date”导入到R中正确的列位置。 但是,这听起来好像是一个不可用的选项。

我想这不适用于你的Linux机器,所以这只是一个Mac-whine:gdata-package给出了弃用警告,然后在R 3.0.0上安装了XLSX支持文件,但是安装了普通的Perl 5.8 “/select/ local / bin目录/ Perl的。 尽pipe“gdata :: findPerl”能够成功find它。

在这一点上,我认为这个问题应该被redirect到询问是否可以使用gdata函数来检查文件的属性。 看了xls的代码库阅读,我相当怀疑它,因为没有看到任何提及检查不同的xls版本。

在使用Mac版本的Excel创build的空白xls文件结尾附近,使用文本编辑器查看:

 Worksheets˛ˇˇˇˇˇ ¿F$Microsoft Excel 97 - 2004 Worksheet˛ˇˇˇ8FIBExcel.Sheet.8˛ˇ ‡ÖüÚ˘Oh´ë+'≥Ÿ0îHPhħ ∞ºƒ'David WinsemiusDavid WinsemiusMicrosoft Macintosh Excel@ê˚á!Ë+Œ@ê'å-Ë+ŒG»˛ˇˇˇPICT¿Kġ 

另一个不同之处在于,Windows版本以相同的方式检查了“Excel 2003工作表”作为工作表的types,而对于Mac版本则是“Excel 97 – 2004”。 所以,也许你可以强制R绕过在扫描“Macintosh”的过程中读取或擦除时触发的所有错误。 也许Linux-R更耐这种东西?

 Error: invalid multibyte string at '<ff>' 

我也从grep得到了一堆警告,提示我可能无法“看见”一些string:

 Warning message: In grep("Macintosh", lin) : input string 1 is invalid in this locale 

您可能能够从gdata包中的xls2csv.pl中的Perl代码中获得一些更健壮的代码。