我在使用R的XLConnect软件包时遇到了最奇怪的问题,我想知道是否有人对导致它的原因有任何了解。
我写了一个R脚本来合并大约100个Excel文件中的数据;我使用以下位加载每个文件的内容:
tempo <- as.data.frame(readWorksheetFromFile(file = o,
sheet = 1,
header = FALSE,
startRow = 1,
endRow = 0,
startCol = 1,
endCol = 0,
autofitRow = FALSE,
autofitCol = FALSE))
原始文件是人们填写的表格,其中包含我在各行和各列中需要的值。我需要的结果是一个数据框,其中来自表单的每个值都是一个单独的变量,并且每个文件都是一个观察值。我已经映射了文件的结构,并编写了一个脚本,该脚本将我想要的所有值转换为一堆矢量,然后根据需要对它们进行cbind()和rbind()来构造我的数据帧。
该脚本运行良好,除了精确地一个文件中的一个空单元格,XLConnect拒绝将其读取为NA,从而导致列不匹配。
我在文件“ tempo”中找到此特定表格部分“ a.3。”。开始:
anchor.a.3. <- which(apply(tempo, c(1,2), function(x) any(grepl("^a.3.$", x))), arr.ind = TRUE)
(我进行字符串匹配是因为这些表单的结构相似,但并非所有表单部分都在所有文件的同一单元格中开始)。 我得到此单元格的行和列索引:
r <- anchor.a.3.[[1]]
c <- anchor.a.3.[[2]]
...,然后我告诉R从“ a.3。”部分创建一个包含四个值的向量,在相对于[r,c]的索引的单元格中找到它们(我需要的值始终处于相同位置关于此“锚定”单元格:
a.3. <- c(unlist(c(tempo[r+3, (c+3):(c+4)])), tempo[r+3, c+6], tempo[r+4, c+3])
问题在于,对于一个文件,其中[r + 3,c + 6]单元为空(恰好是合并的单元格G111-H111),XLConnect似乎没有将其读取为NA 。四个值应为:“ 0”,NA,NA,NA;而R给我:
Col4 Col5
"0" NA NA
同样,当我只要求速度[r + 3,c + 6]时,结果是NULL,而不是我期望的NA。
我认为问题可能在于它是一个合并的单元格,但是我正确地从所有其他合并的单元格中获取了值。
实际上,至少还有其他三个文件,该相同(相等合并)的单元格也留空了,我正确地获得了向量a.3中的NA。我试图将有问题的文件与这些文件的结构以及单元格的格式进行比较,但我无法识别出任何差异。
在有问题的文件中,a.3节的最后一个单元格。我需要的是tempo [r + 4,c + 3)也是一个合并的单元格,它一直留空;我也正确地得到那一个。
我做了一个小实验:我在有问题的文件的空白单元格中输入了“ a”,将其保存,然后重新运行我的脚本。我正确地得到了“ 0”,NA,“ a”,NA。
我很想为大家重现问题,但我不能:所有其他空单元格都被读取为NA。所以我只是无法从一个文件中的那个单元格获得NA值!是否有人对导致此故障的原因以及解决方案有任何想法?我缺少明显的东西吗?