我正在将xlsx2007表导入到R 3.2.1patched使用包readxl 0.1.0下Windows 7 64.表的大小大约为25,000行乘200列.
功能read_excel()是一种享受.我唯一的问题是它将列类(数据类型)分配给稀疏填充的列.例如,给定列可以是20,000行的NA,然后在行20,001上取字符值.read_excel()在扫描列的前n行并NAs仅查找时,似乎默认为列类型数字.导致问题的数据是指定为数字的列中的字符.达到错误限制时,执行停止.我实际上想要稀疏列中的数据,因此将错误限制设置得更高并不是解决方案.
我可以通过查看抛出的警告来识别麻烦的列.并且read_excel()可以通过col_types根据包docs 设置参数来断言列的数据类型:
或者NULL猜测从电子表格或字符向量含有blank,numeric,date或text.
但是,这是否意味着我必须构建一个长度为200的向量,几乎每个位置都有一些位置,blank并且text对应于有问题的列?
可能有一种方法可以在几行R代码中执行此操作.创建一个所需长度的向量,并用blanks 填充它.也许是另一个包含要强制的列数的向量text,然后......或者可能只调用read_excel()其猜测不符合要求的列.
我很感激任何建议.
提前致谢.
这取决于您的数据在不同列的不同位置是否稀疏,以及它的稀疏程度。我发现有更多的行并没有改善解析:大多数仍然是空白的,并被解释为文本,即使后来它们变成了日期,等等。
一种解决方法是生成 excel 表的第一个数据行以包含每一列的代表性数据,并使用它来猜测列类型。我不喜欢这样,因为我想保持原始数据完好无损。
另一种解决方法,如果您在电子表格中有完整行的地方,就是使用nskip替代n。这给出了列猜测的起点。假设数据行 117 有一组完整的数据:
readxl:::xlsx_col_types(path = "a.xlsx", nskip = 116, n = 1)
Run Code Online (Sandbox Code Playgroud)
请注意,您可以直接调用该函数,而无需在命名空间中编辑该函数。
然后,您可以使用电子表格类型的向量来调用 read_excel:
col_types <- readxl:::xlsx_col_types(path = "a.xlsx", nskip = 116, n = 1)
dat <- readxl::read_excel(path = "a.xlsx", col_types = col_types)
Run Code Online (Sandbox Code Playgroud)
然后您可以手动更新仍然出错的任何列。
我遇到过类似的问题.
在我的例子中,空行和列用作分隔符.并且表中包含许多表格(具有不同的格式).所以,{openxlsx}并且{readxl}包不适合这种情况,导致openxlsx删除空列(并且没有参数来改变这种行为).Readxl包按照您的描述工作,有些数据可能会丢失.
在结果中,我认为,如果您想自动处理大量的Excel数据,最佳解决方案是在不更改"文本"格式的情况下读取工作表,然后根据您的规则处理data.frames.
此功能可以无需更改即可读取工作表(感谢@ jack-wasey):
loadExcelSheet<-function(excel.file, sheet)
{
require("readxl")
sheets <- readxl::excel_sheets(excel.file)
sheet.num <- match(sheet, sheets) - 1
num.columns <- length(readxl:::xlsx_col_types(excel.file, sheet = sheet.num,
nskip = 0, n = 1))
return.sheet <- readxl::read_excel(excel.file, sheet = sheet,
col_types = rep("text", num.columns),
col_names = F)
return.sheet
}
Run Code Online (Sandbox Code Playgroud)
自readxl1.x版以来的新解决方案:
当前首选答案中的解决方案不再适用于版本低于0.1.0的版本,readxl因为readxl:::xlsx_col_types不再使用已使用的包内部函数。
新的解决方案是使用新引入的参数guess_max来增加用于“猜测”列的适当数据类型的行数:
read_excel("My_Excel_file.xlsx", sheet = 1, guess_max = 1048576)
Run Code Online (Sandbox Code Playgroud)
值1,048,576是Excel当前支持的最大行数,请参阅Excel规范:https : //support.office.com/zh-cn/article/Excel-specifications-and-limits-1672b34d-7043-467e-8e27 -269d656771c3
PS:如果你关心性能使用所有行猜测的数据类型:read_excel似乎读取文件只有一次,所以比起保存的工作性能损失很小的猜测是在内存中完成即可。
阅读源代码,看起来列类型是由函数xls_col_types或猜测的xlsx_col_types,这些函数在 Rcpp 中实现,但具有默认值:
xls_col_types <- function(path, na, sheet = 0L, nskip = 0L, n = 100L, has_col_names = FALSE) {
.Call('readxl_xls_col_types', PACKAGE = 'readxl', path, na, sheet, nskip, n, has_col_names)
}
xlsx_col_types <- function(path, sheet = 0L, na = "", nskip = 0L, n = 100L) {
.Call('readxl_xlsx_col_types', PACKAGE = 'readxl', path, sheet, na, nskip, n)
}
Run Code Online (Sandbox Code Playgroud)
我的 C++ 很生疏,但看起来这个n=100L命令告诉我们要读取多少行。
由于这些是非导出函数,因此请粘贴:
fixInNamespace("xls_col_types", "readxl")
fixInNamespace("xlsx_col_types", "readxl")
Run Code Online (Sandbox Code Playgroud)
在弹出窗口中,将 更改n = 100L为更大的数字。然后重新运行文件导入。
| 归档时间: |
|
| 查看次数: |
12028 次 |
| 最近记录: |