2013-11-18 5 views
1

У меня есть вектор идентификаторов, которые описывают членство в группе. Каждый идентификатор появляется только один раз в списке.Извлечь определенные строки, используя R

Пример:

GO:0006169 
GO:0032238 
GO:0046086 
GO:0006154 
GO:0046085 
GO:0004001 

У меня также есть таблица (3 столбцов, 74985 строк, без заголовков), содержащая отдельные идентификаторов в V1 (записанная в виде числа), группа идентификаторы в V2. И краткое описание группы в V3.

Пример:

1 GO:0003674           molecular_function 
1 GO:0005576           extracellular region 
1 GO:0008150           biological_process 
2 GO:0001869 negative regulation of complement activation, lectin pathway 
2 GO:0004867     serine-type endopeptidase inhibitor activity 
2 GO:0005515            protein binding 

Каждый человек может принадлежать более чем одной группе, и каждая группа может иметь более одного человека в нем. В примере индивидуум 1 находится в группе GO:0003674, GO:0005576 and GO:0008150.

Я хотел бы извлечь и сохранить из таблицы каждую строку (то есть каждую группу), где идентификатор группы совпадает с вектором идентификаторов группы. Некоторые из идентификаторов в первом векторе не совпадают в таблице. Я пробовал использовать функцию слияния, но без успеха кажется, что в группе один и тот же человек несколько раз.

ответ

3

Я предполагаю, что с таблицей вы имеете в виду фрейм данных - если нет, просто конвертируйте и, возможно, отрегулируйте имена столбцов, используя names() или вместо этого используйте индексы.

подстановок индексов в ФР с which(), а затем использовать их для извлечения соответствующих строк:

> df <- data.frame(g=1:10,v=1:10) 
> v <- c(3,4,7,33) 
> df[df$g %in% v,] 
    g v 
3 3 3 
4 4 4 
7 7 7 

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

+1

Параметр ', который()' ненужно - '% в%' возвращает логическое вектор, 'ф.р. [DF $ г% в% об,]' будет делать это – alexwhan

+0

(+1) хорошая настройка с поправкой – Raffael

+0

Это был dataframe да. Это дает мне кое-что, но у меня, кажется, меньше людей в каждой группе по результатам, чем в исходном кадре данных. New_data = old_data [old_data $ V2% in% Vector_of_ID,] – user3000124

2

Использование merge:

#dummy - GO dataframe 
df1 <- read.table(text="GO:0006169 
GO:0032238 
GO:0046086 
GO:0006154 
GO:0046085 
GO:0004001",col.names=c("GO_ID")) 

#dummy - sample 
df2 <- read.table(text=" 
1 GO:0003674 molecular_function 
1 GO:0046086 extracellular_region 
1 GO:0008150 biological_process 
1 GO:0046085 xxx 
2 GO:0046085 negative_xx_lectinpathway 
2 GO:0004867 serine-type_endopeptidase_inhibitor 
2 GO:0005515 protein_binding",col.names=c("Sample_ID","GO_ID","Description")) 

#output 
merge(df1,df2) 
#GO_ID Sample_ID    Description 
#1 GO:0046085   1      xxx 
#2 GO:0046085   2 negative_xx_lectinpathway 
#3 GO:0046086   1  extracellular_region 
+0

+1, но это не будет охватывать более одного ID, иначе оно вернет Sample_ID и Sample_ID_2, а затем сбой, если я хорошо помню. – Llopis

+0

@Llopis Не могли бы вы объяснить свой комментарий? – zx8754

+0

Если есть Sample_ID 1, у которого есть GO: 0046085 и Sample_ID, которые имеют то же самое, что произойдет? В этом случае я думаю, что это будет действовать, как я сказал в предыдущем комментарии – Llopis

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