2013-11-15 2 views
1

У меня есть несколько файлов данных в каталоге (все tsvs). Один файл данных будет выглядеть следующим образом:R - Выполнение расплавления на каждой кадре данных в списке

Killed Rick Darryl Herschel Tyrese Shane 
Zombies 200  300  20   4   100 
People 10  2   0   0   0 
Dogs  0  0   0   0   0 

Следующий файл данных хотел это:

Killed Jon Rob Varys Ned Joeffry Mormont 
Whites 1  0  0  0  0   0 
People 0  10  1  30  0   100 

Я хотел бы объединить его так, что файлы данных будут читать так:

Killed Variable Value 
Zombies Rick  200 
Zombies Darryl  300 
Zombies Herschel 20 
Zombies Tyrese  4 
Zombies Shane  100 
People Rick  10 
People Darryl  2 
People Herschel 0 
People Tyrese  0 
People Shane  0 
Dogs  Rick  0 
Dogs  Darryl  0 
Dogs  Herschel 0 
Dogs  Tyrese  0 
Dogs  Shane  0 
Whites Jon   1 
Whites Rob   0 
Whites Varys  0 
Whites Ned   0 
Whites Joeffry  0 
Whites Mormont  0 
People Jon   0 
People Rob   10 
People Varys  1 
People Ned   30 
People Joeffry  0 
People Mormont  100 

Я хотел бы проанализировать каталог и загрузить все данные в R, а затем расплавить каждый фрейм данных, используя пакет переформатирования. Я хотел бы использовать rbind для объединения всех кадров данных в один кадр данных. Вот код, который я до сих пор:

library(reshape) 

filenames <- list.files(pattern='*.tsv') 

names <- substr(filenames,1, nchar(filenames)-4) 

newmelt <- function(x) { 
    x <- melt(x, id=c("ID_REF")) 
} 

for (i in names){ 
    filepath <- file.path(paste(i,".tsv", sep="")) 
    assign(i, read.csv(filepath, sep="\t")) 
} 

sapply(names(names), newmelt) 

Я знаю, что я могу получить результаты, которые я хочу с помощью этого:

test <- read.csv("marvel.tsv", sep="\t") 
test.m <- melt(test, id=c("Killed")) 

Но я не знаю, как я могу применить это в течение всего кадры данных в моем списке.

Благодарим за понимание!

EDIT: Я вдруг слова.

+0

должен ли результат быть один большой комбинированный топленое кадр данных, или список расплавленных кадров данных? – joran

+0

@joran Да, что я хотел бы записать в файл. –

+0

'melt.list' существует и будет вызывать' melt.data.frame' для каждого компонента, поэтому вы можете «расплавить» (lapply (имена файлов, read.table), id = c («Killed»)) ' – baptiste

ответ

6

Несколько вещей, чтобы указать здесь.

Во-первых, вы действительно должны использовать reshape2, Reshape уже не в стадии разработки.

Во-вторых, избегайте использования assign (обычно), но особенно в таких ситуациях. Это не очень «R-ish», и это приведет к плохим привычкам и трудно отлаживает проблемы.

В-третьих, если вы на самом деле файлы вкладки разделены, не используйте read.csv (читать документацию заметки на read.csv внимательно, это не то, что вы хотите!), Используйте read.table.

Я хотел бы подойти к этому больше, как это:

library(reshape2) 

filenames <- list.files(pattern='*.tsv') 

myfun <- function(x){ 
    dat <- read.table(x,sep = "\t",header = TRUE) 
    melt(dat,id.vars = "Killed") 
} 

#Just iterate over the file paths 
# calling one function that reads in the file and melts 
out <- lapply(filenames,myfun) 
#Put them all together into one data frame 
out <- do.call(rbind,out) 
Смежные вопросы