2016-05-26 11 views
0

Установка сцены:R: Транспонирование таблицы результатов а и добавить заголовки столбцов

Так у меня есть каталог с 50 .csv файлов в ней.

Все файлы имеют уникальные имена, например. 1.csv 2.csv ...

Содержание каждого может изменяться по количеству строк, но всегда есть 4 колонки

Заголовки столбцов:

  • Дата
  • Результат 1
  • Результат 2
  • ID

Я хочу, чтобы все они были объединены в один фрейм данных (mydf), а затем я хотел бы игнорировать любые строки, где есть значение NA.

Чтобы я мог подсчитать, сколько полных экземпляров «ID» было. Например, позвонив;

  • MyFunc ("my_files", 1)
  • MyFunc ("my_files", с (2,4,6))

Мой код до сих пор:

myfunc <- function(directory, id = 1:50) { 
     files_list <- list.files(directory, full.names=T) 
     mydf <- data.frame() 
     for (i in 1:50) { 
       mydf <- rbind(mydf, read.csv(files_list[i])) 
     } 
     mydf_subset <- mydf[which(mydf[, "ID"] %in% id),] 
     mydf_subna <- na.omit(mydf_subset) 
     table(mydf_subna$ID) 
} 

Мои вопросы и где мне нужна помощь:

Мои результаты вышли таким образом

2 4 6 
200 400 600 

, и я бы хотел, чтобы они были такими, чтобы они были такими. Я не уверен, правильно ли вызывается таблица, или я должен назвать ее as.matrix, возможно?

2 100 
4 400 
8 600 

Я хотел бы также иметь либо заголовки из исходных файлов или назначить новые

ID Count 
2 100 
4 400 
8 600 

Любые и все советы приветствуются

Matt

Дополнение

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

myfunc <- function(directory, id = 1:50) { 
     files_list <- list.files(directory, full.names=T) 
     mydf <- data.frame() 
     for (i in 1:50) { 
       mydf <- rbind(mydf, read.csv(files_list[i])) 
     } 
     mydf_subset <- mydf[which(mydf[, "ID"] %in% id),] 
     mydf_subna <- na.omit(mydf_subset) 
     result <- data.frame(mydf_subna$ID) 
     transposed_result <- t(result) 
     colnames(transposed_result) <- c("ID","Count") 
} 

, который я пытаюсь позвонить с этим:

myfunc("myfiles", 1) 
myfunc("myfiles", c(2, 4, 6)) 

, но я получаю эту ошибку

> myfunc("myfiles", c(2, 4, 6)) 
Error in `colnames<-`(`*tmp*`, value = c("ID", "Count")) : 
    length of 'dimnames' [2] not equal to array extent 

Интересно, если возможно, я не создаю эту data.frame правильно и должно использовать cbind или не суммировать строки по ID, может быть?

ответ

0

Добро пожаловать в Переполнение стека.

Я предполагаю, что функция, которую вы написали, возвращает таблицу, которая сохраняется в переменной ans.

Вы можете дать попробовать на этот код:

ans <- myfunc("my_files", c(2,4,6)) 

ans2 <- data.frame(ans) 

colnames(ans2) <- c('ID' ,'Count') 
+0

Привет @ Kanal-пури, спасибо за быстрый ответ. Я создал функцию ** Myfunc **, в которой у него есть пустой data.frame ** mydf **, это добавляет к нему все прикрепленные файлы. Затем я подмножаю его, чтобы иметь только значение ID, которое я указываю, когда я его вызываю через некоторое время, но я также опускаю любые значения NA и сохраняю это ** mydf_subna **. Именно эту переменную я помещаю в таблицу. Если мой эквивалент вашего ** ans2 ** будет ** mydf_subna ** – Mchapple

+0

Он должен быть эквивалентен значению, возвращаемому функцией, например. '2 4 6 200 400 600'. См. Редактирование. –

0

Вам нужно хотите изменить свою функцию, чтобы создать фрейм данных, а не таблицу, а затем перенести этот кадр данных. Измените строку

table(mydf_subna$ID) 

быть вместо

result <- data.frame(mydf_subna$ID) 

затем использовать функцию т(), который переставляет свои данные кадра

transposed_result <- t(result) 

colnames(transposed_result) <- c("ID","Count") 
+0

Спасибо @clairekelly, все, что вы сказали, имело смысл, однако, когда я запустил это, он вернулся с ошибкой. Я только что включил бизнес-конец функции для ссылки: 'mydf_subna <- na.omit (mydf_subset)' 'result <- data.frame (mydf_subna $ ID) ' ' transposed_result <- t (result) ' ' colnames (transposed_result) <- c ("ID", "Count") ' '} ' '> complete ("myfunc", c (2, 4, 6)) ' ' Ошибка в именах кодов <- (* tmp *, value = c ("ID", "Count")): ' ' длина dimnames [2] не равна размеру массива ' – Mchapple

+0

Я предполагаю, что это означает, что ваш фрейм данных - неправильная форма. Можете ли вы сделать тусклый (transposed_result) и узнать, какова его форма? – clairekelley

+0

часть 1/2 - Привет @calirekelly. Поскольку это внутри функции, я, похоже, не могу сделать тусклый (transposed_result). Я предполагаю, что это потому, что data.frame не создается до тех пор, пока не будет вызван запрос. * Коррекция * Думаю, у меня была опечатка в предыдущем блоке. С приведенным ниже кодом я теперь получаю '> myfunc (" specdata ", 1) NULL' и когда я вызываю'> dim (transposed_result) Ошибка: объект 'transposed_result' не найден' – Mchapple