Создание новых фреймов данных из большего фрейма данных с использованием списка - PullRequest
1 голос
/ 05 октября 2011

У меня есть фрейм данных, который содержит несколько точек данных для большого количества выборок. Вот сокращенный пример с 3 выборками, каждый с 3 точками данных:

Assay       Genotype      Sample 
CCT6-002        G         sam1   
CCT6-007        G         sam1
CCT6-013        C         sam1 
CCT6-002        T         sam2   
CCT6-007        A         sam2
CCT6-013        T         sam2 
CCT6-002        T         sam3   
CCT6-007        A         sam3
CCT6-013        T         sam3 

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

Я бы хотел, чтобы мои выходные данные представляли собой фрейм данных для каждого образца с тем же именем, что и образец. Таким образом, с данными примера выше, результатом должно быть 3 кадра данных с именами sam1, sam2, sam3. Каждый фрейм данных будет иметь 3 строки с данными анализа и генотипа.

Прошу прощения, если это очень простой вопрос, но я новичок и уже давно над этим работаю. Спасибо!

1 Ответ

3 голосов
/ 05 октября 2011

Команда split - это самый простой способ превратить это в список объектов data.frame, разделенных по образцу.

myList <- split(mydf, mydf$Sample)

Доступ к элементам в списке можно получить с помощью числовой индексации (т. Е. myList[[1]]) или по имени уникального элемента в переменной Sample (т. е. myList$sam1).

Числовая индексация, безусловно, удобна, когда вы проходите последовательность, но вы все равно можете использовать имя для нее какЧто ж.

 #get names of the unique items in sample
 nam <- unique(mydf$Sample)
 #as a test look at the first few rows of each of my data.frames
 for( i in nam) print( head(myList[[i]]) )
 #another way to use access to the data.frame is the with() statement
 for( i in nam) with(myList[[i]], print( Assay[1:2] )

Это не обязательно самый эффективный синтаксис R, но, надеюсь, он продвинет вас дальше, фактически используя ваш список объектов data.frame.

Теперь, это дает вам то, о чем вы просилино вот несколько советов о том, что вы просили.Не делай этого.Просто научитесь правильно обрабатывать объект data.frame.Вы также можете легко не составить список и просмотреть все уникальные экземпляры Sample в своем коде ... включая сохранение их в виде отдельных файлов.Преимущество этого состоит в том, что вы можете выполнять множество изящных векторизованных команд на вашем целом data.frame в Sample, которые намного сложнее в списке.Просто придерживайтесь хороших больших данных.

Вот несколько простых примеров.Посмотрите на то, что я сделал выше для получения первых нескольких строк каждого из отдельных объектов data.frame в списке.Вот что-то похожее, просто запустите большой data.frame.

lapply( unique(mydf$Sample), function(x) print(head( mydf[ mydf$Sample == x,] )) )

Как насчет чего-то более значимого?Допустим, я хочу, чтобы количество каждого отдельного генотипа отделялось от образца.

table( mydf$Genotype, mydf$Sample)

Это намного проще, чем то, что вы должны делать с большим списком.Есть много таких функций, как вы, которые вы хотите подать на ваш неповрежденный data.frame, как tapply и aggregate.Даже если вы захотите сделать что-то, что кажется более легким, если разбить data.frame, например, сортировать по каждому уровню семпла, это проще с data.frame.

mydf[ order(mydf$Sample, mydf$Assay), ]

Это упорядочитSample, а затем Assay, вложенный в Sample.

Когда я начал RI, я думал, что разделение объектов data.frame - это путь, и он часто его использует.Так как я выучил R лучше, я никогда этого не делаю.У меня нет ни единого бита кода R, написанного после нескольких недель работы с R, который когда-либо разбивал бы data.frame в список.Я не говорю, что ты никогда не должен это делать.Я просто говорю, что это относительно редко, когда тебе это нужно или это лучшая идея.Возможно, вы захотите опубликовать здесь запрос о вашей конечной цели и получить совет по этому вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...