R - разделить на более мелкие кадры данных на основе информации в столбце

Допустим, у меня есть файл с разделителями табуляцией fileA.txt, содержащий несколько типов информации следующим образом:

X         123       78000    0        romeo 
X         78000     78004    56       juliet    
Y         78004     78005    12       mario
Y         78006     78008    21       mario   
Y         78008     78056    8        luigi 
Z         123       78000    1        peach 
Z         78000     78004    24       peach    
Z         78004     78005    4        peach
A         78006     78008    12       zelda   
A         78008     78056    14       zelda

У меня есть этот фрейм данных, сохраненный в переменной следующим образом:

df <- read.table("fileA.txt",sep="\t",colClasses=c("character","numeric","numeric","numeric","character"))
colnames(df) <- c("location","start","end","value","label")

Предположим, что я не знаю, сколько разных строк содержится в первом столбце df[,1], и назовем это число n. Я хотел бы автоматически генерировать n новых фреймов данных, каждый из которых содержит информацию для одного типа строки. Как мне написать функцию для этого?


person biohazard    schedule 08.02.2014    source источник


Ответы (3)


Вероятно, вам нужно:

library(plyr)
out <- llply(unique(df[,1]), function(x) subset(df, df[,1]==x))
out

Он создает list, где каждый элемент представляет собой data.frame с определенным location.

Теперь вы можете получить доступ к data.frames как: out[[1]].

Если вы хотите сохранить имена:

names(out) <- unique(df[,1])
out$X # gives data.frame with location=='X'
person redmode    schedule 08.02.2014
comment
Спасибо, это именно то, что я искал. - person biohazard; 08.02.2014
comment
Хороший трюк для сохранения имен :) - person biohazard; 08.02.2014

Вы можете сделать это с помощью разделения, которое вернет list, содержащее data.frame, названное в честь каждого уровня, на котором вы разделились.

df <- data.frame(v = rep(1:10, 2), n = rep(letters[1:10], 2))
split(df, df$n)
person matt_k    schedule 08.02.2014
comment
Спасибо за ваш ответ. Я не знал о split(), так что это полезная информация. Однако df[,1] не обязательно содержит только буквы алфавита, а length(df[,1]) не обязательно равно 10, поэтому я воспользуюсь более общим ответом пользователя: redmode. - person biohazard; 08.02.2014
comment
Ни одна из этих вещей не должна быть правдой. Я просто привел воспроизводимый пример, поскольку вы не дали нам его. Просто вызовите split для своего data.frame, а вторым аргументом должно быть то, на что вы хотите разделить. - person matt_k; 08.02.2014
comment
Конечно, мне просто нужно было подтвердить один из ответов, вот и все. Спасибо за уделенное время :) - person biohazard; 08.02.2014

person    schedule
comment
Это тоже круто с assign(), я могу удалить df[,1] из вывода, изменив последнюю часть на df[df[,1]==x,][-1] - person biohazard; 08.02.2014