2015-05-19 2 views
0

Я пытаюсь в основном иметь частотную таблицу из столбца в отдельных текстовых файлах из папки в один хороший файл данных.Создание частотной таблицы данных из папки txt-файлов

У меня есть папка с 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 (Рез, Attr (.data, "split_labels"), .id, id_as_factor): Результаты не равны длины

Я знаю, что отдельные файлы не все имеют покрытие в том же году или одинаковое количество строк, и я думаю, что это может быть проблемой.

Есть ли лучший подход?

+0

Как насчет использования 'lapply' вместо' ldply'? Еще ошибка? – user227710

+0

Я могу использовать lapply, чтобы получить список. Я смотрю на это сейчас. Я также пробовал кое-что отсюда: http: //stackoverflow.com/questions/9250344/combine-frequency-tables-into-a-single-data-frame? Rq = 1 без везения – ChristinaP

ответ

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 - но это сработало!