2015-10-06 3 views
1

У меня есть 2 кадра данныхСравнивая элементы data.frames в R

> a1 
v1 v2 v3 
ABCA1 --> GIF 
ACTA1 --| CSNK2A1 
ACTN4 --| HDAC7 
ACTN4 --> RARA 

> a2 
v1 v2 v3 
ACTA1 --| CSNK2A1 
ABCD2 --| HDAC7 
ABCA1 --| GIF 
ACTN4 --> XYZ1  

Я хочу, чтобы результат, где a1$element1 == a2$element1 & a1$element3 == a2$element3 & a1$element2 != a2$element2. Таким образом, результат будет следующим:

> a3 
ABCA1 --> GIF 

Поскольку все элементы в этом ряду соответствуют нашим всем 3 условиям. Это строка 1 в a1 и строка 3 в a2. Как вы можете видеть (строка 1 из a1 и строки 3 из a2) ABCA1 == ABCA1 & --> != --| & GIF == GIF

ответ

3

Вы можете попробовать merge:

m2 <- merge(a1, a2, by=c("v1", "v3")) 
m2[m2[,3] != m2[,4],][c(1,3,2)] 
#  v1 v2.x v3 
#1 ABCA1 --> GIF 

Мы первые сливаться на колонках 1 и 3. Это соединит случаи первых двух условий. Для последнего условия проверяйте случаи, когда символы столбца различны.

Также при создании кадров данных также должно быть установлено значение stringsAsFactors ЛОЖЬ.


С data.table, вы можете объединить с помощью своей мелкой эффективности копирования.

setDT(a1)[a2, on = c("v1", "v3")][v2 != i.v2] 
     v1 v2 v3 i.v2 
1: ABCA1 --> GIF --| 
+0

Спасибо .. Он сделал свою работу. – user3253470

+0

Возможно, также 'library (data.table); setDT (a1) [a2, on = c ("v1", "v3"), nomatch = 0L] [v2! = i.v2] 'просто для удовольствия –

+0

@DavidArenburg Можете ли вы мне помочь с этим вопросом: [http: //stackoverflow.com/questions/35484595/data-frame-merge-and-selection-of-values-which-are-common-in-2-data-frames] – user3253470

2

Это, кажется, работает для меня:

a1[ intersect(which((paste0(a1$v1, a1$v3) %in% paste0(a2$v1, a2$v3))), 
       which(a1$v2 != a2$v2)) ,] 

#  v1 v2 v3 
#1 ABCA1 --> GIF 

Во-первых, выяснить, какие строки в a1 и a2 имеют общие столбцы 1 и 3. Затем найти какие строки не имеют второй столбец общего. Затем возьмите пересечение двух и используйте это для подмножества a1.

данных:

a1 <- read.table(header=T,text='v1 v2 v3 
ABCA1 --> GIF 
ACTA1 --| CSNK2A1 
ACTN4 --| HDAC7 
ACTN4 --> RARA', stringsAsFactors=F) 

a2 <- read.table(header=T,text='v1 v2 v3 
ACTA1 --| CSNK2A1 
ABCD2 --| HDAC7 
ABCA1 --| GIF 
ACTN4 --> XYZ1', stringsAsFactors=F) 
+0

Можете ли вы мне помочь с этим вопросом: [http: //stackoverflow.com/questions/35484595/data-frame-merge-and-selection-of-values-which-are-common-in-2-data-frames] – user3253470