专有软件会生成难看的excel表格…我可以将它们放入R吗?
我们收集bat呼叫并分析它们,输出结果是一场噩梦。我想简化我们的流程,但我被难倒了。如何从excel中获取数十个文件,如下所示: 并获得导入以添加行,这样每一组四行之间间隔两行(即,第3-6行、第9-12行、第15-18行,等等——每个项目的间距相同)都会被导入,直到达到空空间为止(每个项目的重复次数不同)?我还想在每个四行段的空白处设置专有软件会生成难看的excel表格…我可以将它们放入R吗?,r,excel,xlconnect,R,Excel,Xlconnect,我们收集bat呼叫并分析它们,输出结果是一场噩梦。我想简化我们的流程,但我被难倒了。如何从excel中获取数十个文件,如下所示: 并获得导入以添加行,这样每一组四行之间间隔两行(即,第3-6行、第9-12行、第15-18行,等等——每个项目的间距相同)都会被导入,直到达到空空间为止(每个项目的重复次数不同)?我还想在每个四行段的空白处设置endCol 我可以使用以下方法轻松指定给定站点的范围: df<-t(readWorksheetFromFile("file directory"
endCol
我可以使用以下方法轻松指定给定站点的范围:
df<-t(readWorksheetFromFile("file directory",sheet=2,
header=FALSE,startCol=2,startRow=3,endCol=5,endRow=6))
dfQuick and dirty,但是如果每个块都是相同的维度,这应该可以工作,如示例所示:
library(XLConnect)
# Read the whole sheet in once
df <- readWorksheetFromFile("file directory",sheet=2, header=FALSE)
# Figure out how many code chunks you have (each appears to be 7 rows)
nChunks <- floor(nrow(df)/7)
# create blank list where you can house the different chunks
l <- vector("list", length=nChunks)
# Iterate over the chunks reading them each in to their own list element
for(i in 1:nChunks){
if(i > 1){
l[[i]] <- t(readWorksheetFromFile("file directory", sheet=2, header=FALSE, startCol=2, startRow=3, endCol=5, endRow=6))
}
else{
l[[i]] <- t(readWorksheetFromFile("file directory", sheet=2, header=FALSE, startCol=2, startRow=3+(7*i), endCol=5, endRow=6+(7*i)))
}
}
我会像评论中提到的@Frank那样处理这个问题。我将整个内容作为一个大文件读入,然后根据文件路径信息将其拆分为一个列表。一旦这些数据被分割成一个列表,每个数据集就可以在lappy
循环中进行清理
我正在通过readxl::read\u excel
阅读,但是如果您愿意,您可以通过XLconnect的via函数读取整个文件
library(readxl)
orig = read_excel("test.xlsx", col_names = FALSE)
某些虚假数据的前六行如下所示:
X0 X1 X2 X3 X4 X5 X6
<chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 c:\\file directory\\acoustic data\\Site 10\\20160517 <NA> <NA> <NA> <NA> <NA> <NA>
2 identification summary <NA> <NA> <NA> <NA> <NA> <NA>
3 ID EPFU LANO <NA> MID <NA> <NA>
4 N 70 12 <NA> 4 <NA> <NA>
5 % 16 3 <NA> 13 <NA> <NA>
6 MLE(p) 1E-3 2E-3 <NA> <NA> <NA> <NA>
使用此向量拆分文件,通过split
将每个单独的表保存到列表中
orig_list = split(orig, groups)
现在剩下的工作是清理每个数据集,转置内容并删除任何额外的行和列。这也是您可以从文件路径中提取站点和日期信息以添加到数据集以保持组织的地方,我演示了这一点,但这并不是严格必要的。我将所有这些都放入一个函数中,以便在lappy
中使用。注:我曾一度使用了readr::type_convert
,以确保数值变量被正确转换
clean_data = function(data) {
# Get rid of any empty headers (missing values in first column)
new = data[!is.na(data[,1]),]
# Transpose
new = t(new)
# Put into data.frame, removing extraneous columns 1 to 2
# and using first row as variable names
# Convert variables to appropriate type at same time using readr::type_convert
new2 = readr::type_convert(as.data.frame(new[-1, -(1:2)]))
names(new2) = new[1, -(1:2)]
# Add site and date columns by pulling info from original "c:\\..." cell
new2$site = unlist(strsplit(new[1], "\\\\"))[4]
new2$date = unlist(strsplit(new[1], "\\\\"))[5]
# Remove everything after first missing ID
new2[cumsum(is.na(new2$ID)) == 0,]
}
现在循环遍历所有块并清洁每个块。清理后的文件将显示在列表中。如果需要,可以将这些数据行绑定到一个数据集中
lapply(orig_list, clean_data)
我知道这是一篇老文章,但我还是要加上我的.02。我认为您应该使用一些简单的VBA将所有内容组织到Excel中,然后将一个结构良好的文件读入R。我认为使用Excel比在R中完成所有工作要容易得多,您可以清楚地看到。您应该始终使用正确的工具进行作业。只是为了澄清,每个块的行数和列数是否相同?从这个例子看,它看起来像是的。看看这个例子,每个块中的列数似乎不同。那么导入应该采用什么格式呢?我可以想到各种格式:例如1)一个区块列表,每个区块本身就是一个列表,包含一个文件路径和一个数据帧,数据帧有ID、N、%和mle列?或者2)长格式数据帧,带有COL,用于文件路径、ID、Nm、%和mleI获取如下数据。我一眼就看完了整件事;createtab=cumsum(正则表达式匹配“c:\\”)
<代码>拆分(DF,选项卡)
;然后在选项卡上循环,删除空的/不相关的行和列,并获取列名称。它还没有完全准备好,但我知道Excel的“迷你表”方法是Jenny Bryan和Rich FitzJohn正在尝试构建的方法。就目前而言,阅读全文并在事后清理可能是你最好的选择。谢谢。这是有效的,除了不同的专栏,我道歉,如果这是不清楚的帖子…有任何建议吗?嗯。。。。排列的数量是有限的还是会有很大的不同?可能的物种数量是最大的,所以我想说它可能在0-11之间…这取决于我们在哪里取样,但它们通常在4-6左右。好吧,我试了一下。因为这是一个非常小的数字,所以您可以编写一个函数,根据名称最初的名称替换它们。祝你好运。这些名字仍在进行中,但其他一切都会以这种方式展现出来。谢谢谢谢大家的帮助。嘿,aosmith,这很好,但是我正在努力使用“clean_data”功能。我得到了这个错误'error:col_names
必须是TRUE、FALSE或字符向量'error听起来可能来自基于转置数据集第一行的列命名。要对函数进行故障排除,请获取拆分列表的第一个元素,orig_list[[1]]
,并在此数据集上运行函数的每个步骤,以确保一切正常(即,首先删除空标题,然后转置,等等)。还要确保你的真实数据与我的假数据非常相似。如果没有,函数将需要调整以匹配您的确切情况。
groups = cumsum(grepl("c:", orig$X0))
orig_list = split(orig, groups)
clean_data = function(data) {
# Get rid of any empty headers (missing values in first column)
new = data[!is.na(data[,1]),]
# Transpose
new = t(new)
# Put into data.frame, removing extraneous columns 1 to 2
# and using first row as variable names
# Convert variables to appropriate type at same time using readr::type_convert
new2 = readr::type_convert(as.data.frame(new[-1, -(1:2)]))
names(new2) = new[1, -(1:2)]
# Add site and date columns by pulling info from original "c:\\..." cell
new2$site = unlist(strsplit(new[1], "\\\\"))[4]
new2$date = unlist(strsplit(new[1], "\\\\"))[5]
# Remove everything after first missing ID
new2[cumsum(is.na(new2$ID)) == 0,]
}
lapply(orig_list, clean_data)