Команда 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 в список.Я не говорю, что ты никогда не должен это делать.Я просто говорю, что это относительно редко, когда тебе это нужно или это лучшая идея.Возможно, вы захотите опубликовать здесь запрос о вашей конечной цели и получить совет по этому вопросу.