2013-06-21 2 views
0

У меня есть матрица с 2 столбцами, начало матрицы показано ниже:Как отделить строки в столбце на основе спецификации?

  SNP   Pi1   
[1,] "SNP_Label" "Pi1"   
[2,] "rs482519" "0.3722219" 
[3,] "rs12196956" "0.3212364" 
[4,] "CNV548726" "0.3112315" 
[5,] "CNV356212" "0.3078721" 
[6,] "rs4792617" "0.3023402" 
[7,] "CNV2095401" "0.2979626" 
[8,] "CNV4528251" "0.29391"  
[9,] "rs9369426" "0.2860793" 
[10,] "rs31672"  "0.2790241" 
[11,] "rs1323446" "0.2778401" 

Спецификация является то, что я хочу, чтобы отделить ОНП, которые начинаются с «RS» из ОНП, которые начинаются с «CNV» и получить новую матрицу для каждого из двух типов SNPS вместе с их соответствующими значениями Pi1. Имена SNP являются случайными, поэтому «rs» или «CNV» будут отображаться случайным образом в столбце от строки к строке.

Я думаю, мне может понадобиться цикл for для запуска через первые 2 символа каждой записи в столбце SNP, но я не знаю, что это правильно или нет.

+0

... почему ваши данные являются матрицей, а не рамкой данных? Вы уверены, что импортировали его правильно? –

+0

им не уверен. Я всегда импортирую данные с помощью 'data <- read.table()'. это дает мне мои данные в виде матрицы или data.frame? есть разница? – zfz

+0

Справа. Вам нужно импортировать, используя 'read.table (*, header = TRUE)'. Посмотрите, что первая строка вашей матрицы? Это имена ваших столбцов. Без бита 'header = TRUE' R будет рассматривать их как часть ваших данных. В дополнение к тому, чтобы дать вам ложную строку, она испортит второй столбец, который R импортировал как текст, а не числовой, который, как я предполагаю, является тем, чем он должен быть. –

ответ

1

Сделать это data.frame, а затем сделать это:

mylabel <- gsub("[0-9]", "", my.df[[1]]) 
list.of.dfs <- split(my.df, mylabel) 

Путь это работает MyLabel будут сохранены только буквенные идентификаторы в своем первом столбце после GSUB. Затем split разбивает ваш data.frame на куски на основе этих идентификаторов.

Дает вам список data.frames со всеми уникальными ярлыками. После этого вы можете выбрать имена с именами «rs» и «CNV».

$CNV 
     V1  V2 
3 CNV548726 0.3112315 
4 CNV356212 0.3078721 
6 CNV2095401 0.2979626 
7 CNV4528251 0.2939100 

$rs 
     V1  V2 
1 rs482519 0.3722219 
2 rs12196956 0.3212364 
5 rs4792617 0.3023402 
8 rs9369426 0.2860793 
9  rs31672 0.2790241 
10 rs1323446 0.2778401 
+0

спасибо, я просто попробовал это, и это дает мне ошибку: Ошибка: неожиданный символ в "mylabel <- gsub (" [^ [: digit:]] "," "list.of.dfs" – zfz

+0

Мне это нравится потому что оно торгует концепцией списка, который я считаю более удобным, по крайней мере, в конечном итоге. @zfzhao есть две строки кодов (я просто переформатировал его). Попробуй еще раз. –

+0

Извините, я немного поспешил. Я исправил это. – asb

0
a <- data.matrix(cbind(c("rs1","CNV1","rs2","CNV2"),c("a","b","c","d"))) 
rs <- a[grep("^rs",a),] 
cnv <- a[grep("^CNV",a),] 

использование Grep искать ваш шаблон, что «^» проверяет, что картина находится в начале.

+0

Что делает этот код? я ввел его, но что я должен назвать, чтобы получить окончательные результаты? – zfz

+0

Извините, я начал с создания такой матрицы, как ваша, которую я назвал «a». затем я создал 2 новых объекта матрицы, содержащих только rs (называемые «rs») и только cnv (называемый «cnv»). Вам понадобятся только две нижние строки и заменит «a» на название вашей матрицы – ping

Смежные вопросы