【发布时间】:2017-07-28 10:49:31
【问题描述】:
我有一组 excel 文件,每个文件包含一张数据,所有类似的结构(大部分 -- 见下文),我想最终组合成一个大数据框(每个子集都由原始文件索引资源)。 我可以创建多个数据帧的列表,然后将它们合并到一个数据帧中,很容易使用以下代码:
files <- grep(".xlsx", dir(), value=TRUE) # vector of file names
IDnos <- substr(files,20,24) #vector with key 5-digit ID info of each file
library("XLConnect")
library("data.table")
datalist <- lapply(files, readWorksheetFromFile, sheet = "Data")
names(datalist) <- IDnos
bigdatatable <- rbindlist(datalist, idcol = "IDNo")
一个数据列“值”通常是类数字,除了我发现有几个在一行中有一个“ND”,使其成为类字符,因此在最终数据框中该列是字符。
虽然我可以通过一些简单的清理来解决这个问题,但我想知道是否有办法在“数据框列表”阶段识别哪些文件(或我创建的列表的数据框组件)具有列“值”的类字符”。例如,我无法运行 sapply(datalist,class) 或其他变体。我希望避免 for 循环。
有没有办法使用 lapply 或 sapply 深入到列表中的数据框?
【问题讨论】:
-
ND是什么意思?缺失值?如果是这样,那么您需要使用na.strings="ND"来识别它们……如果readWorksheetFromFile具有该参数。 -
您也可以考虑使用
readxl包。函数read_excel接受参数col_types =用于猜测/设置列类和na =,如果这是唯一的缺失值指示符,您可以将其设置为“ND”。 -
Rich,不幸的是我在 XLConnect 包中没有看到 na/na.strings 功能。尼尔,readxl 确实以这种方式工作得很好。但是,我仍然想知道如何在数据帧列表上使用 lapply/sapply 或类似的东西来对每个数据帧中的列执行操作。
-
就像你现在做的那样,只写(一个匿名的)函数。
sapply(yourdata, FUN = function(x) {your code of manipulating the data}).