2015-02-10 2 views
0

У меня есть две матрицы, выглядит следующим образом:Совпадение две матрицы по столбцам

ColumnA ColumnB ColumnC ColumnD  
    A   D   N   F    
    DF  N   A   S  
    P   F   K   l  
    qw  AS  O   W  
      n   H   Q  
         D   E  

B

ColumnA ColumnB ColumnC ColumnD  
    A   DH  K   FS    
    np   N   A   S  
    AS   Q   O   lm  
    P   n   N   WE  
       AS  PV   Q  
         NQ   E  

Я хотел бы треть матрица C, содержащая общий элемент столбцы между столбцами между двумя матрицами. Я попытался выполнить эту работу, используя R, но это кажется невозможным, поскольку две матрицы слишком большие: ~ 5000 строк и 1500 столбцов. Эти две матрицы имеют одинаковое количество столбцов с одинаковыми именами столбцов.

Может ли кто-нибудь мне помочь?

Лучшие

Желаемый результат: C

ColumnA ColumnB ColumnC ColumnD  
    A   N   N   S    
    P   AS  A   Q  
      n   K   E  
         O    
+0

Можете ли вы дать свой желаемый результат для своего примера? – Dason

ответ

2

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

library(stringi) 
#Here `A` and `B` are "data.frames" 
m1 <- stri_list2matrix(Map(`intersect`, A, B), fill='') 
C <- setNames(as.data.frame(m1, stringsAsFactors=FALSE), colnames(A)) 
C 
# ColumnA ColumnB ColumnC ColumnD 
# 1  A  N  N  S 
# 2  P  AS  A  Q 
# 3    n  K  E 
# 4      O   

Или

lst <- lapply(rbind(A,B), function(x) x[duplicated(x)& x!='']) 
m2 <- sapply(lst, `length<-`, max(sapply(lst, length))) 
m2[is.na(m2)] <- '' 
as.data.frame(m2, stringsAsFactors=FALSE) 
# ColumnA ColumnB ColumnC ColumnD 
#1  A  N  K  S 
#2  P  n  A  Q 
#3    AS  O  E 
#4      N   
+0

Я решил с библиотекой «stringi». Он работает очень хорошо. Большое спасибо! – Elb

0

Вы знаете, как использовать SQLite?

В SQLite вы могли бы попробовать что-то вроде

SELECT DISTINCT newtable 
FROM A 
WHERE newtable Not IN (SELECT DISTINCT newtable FROM B) 

это shoulnt быть слишком много хлопот, чтобы создать файл .db

Примечание: если вы работаете в Linux у вас есть SQLite или sqlite3 уже установлены

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