R 阅读excel';应为数字'。。。。。值是数字

R 阅读excel';应为数字'。。。。。值是数字,r,excel,R,Excel,我没有找到这个问题的答案,所以希望这是在这方面得到一些帮助的地方 我正在阅读.zip文件中包含的许多Excel文件。我拥有的每个.zip文件都有大约40个excel文件需要阅读。我试图创建数据帧列表,但在根据文件内容读取某些文件时遇到错误 这是for循环内的读取状态: library(readxl) df[[i]] <- read_excel(xls_lst[i], skip = 4,

我没有找到这个问题的答案,所以希望这是在这方面得到一些帮助的地方

我正在阅读.zip文件中包含的许多Excel文件。我拥有的每个.zip文件都有大约40个excel文件需要阅读。我试图创建数据帧列表,但在根据文件内容读取某些文件时遇到错误

这是for循环内的读取状态:

    library(readxl)
    df[[i]] <- read_excel(xls_lst[i],
                      skip = 4,
                      col_names = FALSE,
                      na = "n/a",
                      col_types = data_types)
嗯,值“9999.99000”在我看来像一个数字。 当我打开创建此警告的Excel文件时,该文件确实显示了这些值,并且还显示列在Excel中的格式为文本。 当我将列格式更改为数字时,请重新保存Excel工作表,然后正确读取数据

然而,我有几百个这样的文件要读。。。
read\u excel
如何忽略excel指示的列格式,而使用调用语句中提供的
col\u type
定义


谢谢,

我试着创建一个玩具示例

我的xlsx文件包含:

3   1
3   3
4   4
5   5
7   '999
6   3
以你的方式阅读:

data_types<-c("numeric","numeric")
a<-read_excel("aa.xlsx",
       col_names = FALSE,
       na = "n/a",
       col_types = data_types 
       )
Warning message:
In read_xlsx_(path, sheet, col_names = col_names, col_types = col_types,  :
[5, 2]: expecting numeric: got '999'
并使用
type.convert

dat[]<-lapply(dat, type.convert)

也许有更好的解决办法。但我认为这应该行得通

您是否可以尝试使用
read.csv
读取相同的文件(发出警告),我将尝试在不设置
col\u types=data\u types
的情况下读取该文件。读入后,应该更容易对列进行正确编码。@akrun:是的,如果我将excel文件保存为.csv文件,则可以正确读取关联的.csv文件。不知道这有什么帮助,除非有一个实用程序可以将~800.xlsx文件全局转换为.csv格式?谢谢你的建议。我可以看到它在单个数据帧上工作。。。。但是,由于我试图构建一个数据帧列表,是否有一种语法可以用于执行
type.convert
?我不知道还有什么更好的方法,我只是尝试了一些类似的方法:
df[[I]][]你把所有的东西都读成了
text
?我认为对于
类型。转换
所有内容都必须是文本。OK@Alex。。。它正在工作。我花了一段时间来解决这个问题,因为我对数据做了几件事,从4个标题行中获取了一些其他信息,需要逐一找出我遇到的另一个问题
type.convert
显然不喜欢处理Posix日期列。我为此找到了另一份工作。所以,你给了我一个有效的解决方案。谢谢@社区:这似乎仍然是
read_excel
的一个“
意外特性”
”,它实际上没有能力强制从excel读取的数据列上的
数字
数据类型,而该列中的所有值实际上都是
数字
。我不确定这是否值得再过一天去探索。在发现了一些令人痛苦的错误之后,我发现了这个转折点:
lappy()
实际上返回了一个列表,而不是一个数据帧列表。因此,我需要找到一种方法来保留数据帧结构列表和/或使用
lappy()
命令将for循环的输出转换回数据帧结构列表。我需要做一些研究来找到一个好的方法。
data_types<-c("text","text")
dat<-read_excel("aa.xlsx",
          col_names = FALSE,
          na = "n/a",
          col_types = data_types
          )
dat[]<-lapply(dat, type.convert)
#list of data frames
l<-list()
l[[1]]<-data.frame(matrix(rep(as.character(1:5),2), ncol = 2), stringsAsFactors = FALSE)
l<-rep(l,3)

#looping over your list to encode columns correctly:
for (i in 1: length(l)){ 
l[[i]][]<-lapply(l[[i]], type.convert)
}