2014-05-08 4 views
0

У меня есть задача сделать функцию, которая принимает путь к каталогу, читает много файлов .csv и возвращает data.frame с числом полных случаев для каждого файла в виде:Подсчитать строки в кадре данных по факторам, сохранить порядок?

## id nobs 
## 1 2 1041 
## 2 4 474 
## 3 8 192 
## 4 10 148 
## 5 12 96 

я следующее решение (функция подписи дается):

complete <- function(directory, id = 1:332) { 
    myFiles <- list.files(path=directory,pattern=".csv",recursive=T,full.names=T) 
    data <- lapply(myFiles[id],read.csv) 
    frame <- do.call("rbind",data) 
    frame <- frame[complete.cases(frame),] 
    frame$ID <- factor(frame$ID, ordered=T) 
    by <- by(frame,frame$ID,nrow,simplify=F) 
    complete <- data.frame(id=names(by),nobs=unlist(by)) 

    return(complete) 
} 

Это дает мне правильный выход, за исключением одного situtation. Если вызов функции - это что-то вроде complete(directory, 30:25), то ожидается, что порядок столбца data.frame id сохраняется (здесь 30,29 и т. Д.). Но это не удается, потому что by сортирует выходной список по факторам. Есть ли лучшее решение для моей проблемы (с использованием стандартных пакетов)? Или я могу заблокировать заказ?

ответ

1

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

Если вы хотите задать данный заказ, вы должны использовать

frame$ID <- factor(frame$ID, levels=unique(frame$ID)) 

, а затем by должны вести себя, как ожидалось.

+0

Спасибо за ваш ответ. Да, у меня было неправильное представление о функции параметра «odered». Когда я использую 'frame $ ID <- factor (frame $ ID, levels = unique (frame $ ID))' Я привожу его для корректной работы, но есть и другая проблема. При вводе типа 'c (2, 4, 8, 10, 12)' сгенерированный data.frame имеет id-значения в его поле row.names. Вместо 1,2,3,4,5 сейчас 2,4,8,10,12 (я должен выполнить полный тест). Остальные части (id, nobs) теперь правильные. –

+0

@Meiner Ну, вы устанавливаете идентификаторы с помощью data.frame (id = names (by), nobs = unlist (by)) ', поэтому вместо использования' names (by) 'just do' id = 1: length () или что-то в этом роде. – MrFlick

+0

Поле 'id' правильно. Я имею в виду числа в самом левом столбце при печати data.frame (без имени столбца). Я должен установить 'row.names = NULL', тогда он работает так, как ожидалось. Перед изменением мне не пришлось делать что-то подобное. –

 Смежные вопросы

  • Нет связанных вопросов^_^