我试图将文件夹中单个文本文件中的列的频率表基本上放到一个漂亮的数据帧中。
我有一个包含1000个文件的文件夹。 1000个文本文件中的每一个都是tab-del UTF-8(他们说,编码一直是个问题),有61列和35-500的不同行数。
在每个文件中,第43列是一年。我想要的最终状态是一个数据框,其中每年都有一列显示在数据集中,1000个文件中的每一个都有一行,以及每年在该文件中出现的年份总数(换句话说,每年出现在第43栏中的次数
我有这个功能:
findCY<-function(savedfile){
text <- read.delim(savedfile, header=FALSE, sep="\t",colClasses=mycolClasses, quote="", na.strings="", encoding="UTF-8-BOM")
cyvec<- as.numeric(text$V43[2:(length(text$V43))])
cyvec<- sort(cyvec, decreasing=FALSE)
labelcyvec<-c(savedfile,cyvec)
return(labelcyvec)
}
其中
mycolClasses<-c("character", rep("NULL",29),"character",rep("NULL",11),"character",rep("NULL",18))
带有文件名的字符向量 - 称为文件名。我试着像这样打电话:
test<- ldply(filenames[600:605], findCY)
然后我融化并重铸并得到了一个漂亮的data.frame:
test.melt<-melt(test,id.vars="V1")
test.cast<-dcast(test.melt, V1~value, fun.aggregate=length)
它与行600-605一起工作得非常漂亮但是当我尝试整个事情,甚至任何其他子集时,我从ldply步骤中得到以下错误:
list_to_dataframe(res,attr(.data,&#34; split_labels&#34;),.。, id_as_factor):结果长度不等
我知道单个文件并不都具有相同的年份覆盖率或相同的行数,我认为这可能是问题所在。
有更好的方法吗?
答案 0 :(得分:0)
更改函数以输出数据框列表并使用lapply确实有效,然后不需要熔化,只需转换:
findCY<-function(savedfile){
text <- read.delim(savedfile, header=FALSE, sep="\t",colClasses=mycolClasses, quote="", na.strings="", encoding="UTF-8-BOM")
cyvec<- as.numeric(text$V43[2:(length(text$V43))])
cyvec<- sort(cyvec, decreasing=FALSE)
labelcyvec<-data.frame(savedfile,cyvec)
print(c(savedfile,"ok"))
return(labelcyvec)
}
CYall<- ldply(filenames, findCY)
CYall.cast<- dcast(CYall, savedfile~cyvec, fun.aggregate=length)
现在我完全糊涂了,因为显然我确实使用了ldply - 但它确实有效!