我对R和编程很新,需要帮助排列~2000 .xls和.xlsx文件中包含的数据。每个文件的开头都是34到40行"垃圾"标题前的文字;标题下的所有数据都具有相同的尺寸。
我试过的第一种方法是将数据添加到列表中;垂直格式没用。
library(readxl)
file.list <- list.files(pattern='*.xls')
dm.list <- lapply(file.list, read_excel)
我目前正在尝试一次读取一个文件,删除&#34;垃圾&#34;文本,并写入.csv文件(逐列附加数据)。
library(readxl)
file.list <- list.files(pattern='*.xls')
for(i in 1:dim.data.frame(file.list))
store.matrix <- read_excel((paste0("C:\\Users\\jlmine\\Desktop\\qPCRextData\\", file.list[i])), sheet = "Results")
while (store.matrix[1,1] != "Well") #search for header
{ store.matrix <- store.matrix[-c(1)] } #delete non-header rows
write.csv(store.matrix, file = "qPCRdataanalysis.csv", append = TRUE)
以下行引发错误:
store.matrix <- read_excel((paste0("C:\\Users\\jlmine\\Desktop\\qPCRextData\\", file.list[i])), sheet = "Results")
错误:&#39; C:\ Users \ jlmine \ Desktop \ qPCRextData \&#39;不存在。在 另外:警告信息:1:dim.data.frame(file.list):
数值表达式有2个元素:只使用第一个
&#34; C:\用户\ jlmine \桌面\ qPCRextData \&#34;被设置为我的工作目录 任何想法都将不胜感激。
答案 0 :(得分:0)
无法访问.xlsx文件,问题似乎出现在for循环语句中。 list.files
返回指定目录中文件的字符向量。在长度为5的向量x上使用dim.data.frame
会得到结果:
#[0, 5]
从您的警告消息中,您只知道for循环中正在使用第一个元素。所以你没有循环任何东西。
因此,如果你想更优雅地遍历所有文件,你就会......
for (i in seq(length(file.list)) {
答案 1 :(得分:0)
我无法在不看到您的某些数据的情况下确定,但看起来您可以在每个文件中阅读,找到&#34; real&#34;数据开始然后删除&#34;垃圾&#34;行。例如:
df.list = lapply(file.list, function(f) {
# Read file
tmp = read_excel(f, sheet="Results")
# Find highest index of row containing "Well" and add 1 (assuming here
# that a row containing "Well" will come before the header row).
s = which(apply(tmp, 1, function(x) {grep("Well", x)}) > 0)
s = ifelse(length(s) > 0, max(s) + 1, 0)
# Reset column names to the values in row s (the actual header row)
# Remove rows 1 through s (the "junk" text plus the header row) from the data frame
if(s > 0) {
names(tmp) = tmp[s, ]
tmp[-(1:s), ]
}
})
您现在拥有df.list
,这是一个列表,其中每个元素都是您刚刚加载的xls / xlsx文件之一。您说您希望按列组合数据,但如果每个数据框具有相同的列,则不希望堆叠数据帧。要做到这一点,你可以这样做:
df.list = do.call(rbind, df.list)
您现在拥有一个数据框,您可以将其另存为csv文件。