2017-10-25 1 views
0

data.table은 매우 유용하지만 다음과 같은 문제를 해결할 수있는 우아한 방법을 찾을 수 없습니다. 거기에 더 가까운 대답이 있지만, 아무도 내 문제를 해결하지 못했습니다. 아래와 같이 data.table 개체가 있고 유전자 쌍 (Gene1과 Gene2)을 기반으로 중복 행을 필터링하지만 두 방법으로 필터링하려고합니다. Gene1 및 Gene2에 대한 이러한 중복이있는 경우R data.table 한 쌍의 열로 된 중복 행

 Gene1 Gene2    Ens.ID.1              Ens.ID.2     CORR 
1:   FOXA1    MYC       ENSG000000129.13.   ENSG000000129.11     0.9953311 
2:   EGFR     CD4       ENSG000000129       ENSG000000129.12     0.9947215 
3:   CD4      EGFR      ENSG000000129.12    ENSG000000129.11     0.9940735 
4:   EGFR     CD4       ENSG000000129       ENSG000000129.12     0.9947215  

, 그럼 나는 이것을 싶어 : 그것은 표준 수백만 개의 행을 통해 코딩 매우 느린

 Gene1 Gene2  Ens.ID.1    Ens.ID.2    CORR 
1: FOXA1 MYC  ENSG000000129.13.  ENSG000000129.11  0.9953311 
2: EGFR  CD4  ENSG000000129   ENSG000000129.12  0.9947215 

. data.table에서 우아하고 빠른 방법이 있습니까?

+3

https://stackoverflow.com/a/25151395/496803을 보셨습니까? 그것은 정확히 당신이하려고하는 것 같습니다. – thelatemail

+0

GEN1과 GEN2를 연결하고 중복을 제거하여 새로운 컬럼을 생성하는 것을 고려할 수 있습니다. – RomRom

답변

4

링크 된 대답 (https://stackoverflow.com/a/25151395/496803는) 거의 중복, 그래서 https://stackoverflow.com/a/25298863/496803이지만, 여기에 약간의 트위스트와 함께 다시 간다 : 당신이> 2 또는 여러 키가있는 경우

dt[!duplicated(data.table(pmin(Gene1,Gene2),pmax(Gene1,Gene2)))] 

# Gene1 Gene2   Ens.ID.1   Ens.ID.2  CORR 
#1: FOXA1 MYC ENSG000000129.13. ENSG000000129.11 0.9953311 
#2: EGFR CD4  ENSG000000129 ENSG000000129.12 0.9947215 

가에 의해 당신을 DEDUP하기 아마도 긴 파일로 변환하고 정렬하고 다시 넓은 파일로 변환 한 다음 중복 제거하는 것이 가장 좋습니다. 좋아요 :

dupvars <- c("Gene1","Gene2") 
sel <- !duplicated(
    dcast(
     melt(dt[, c(.SD,id=.(.I)), .SDcols=dupvars], id.vars="id")[ 
      order(id,value), grp := seq_len(.N), by=id], 
     id ~ grp 
)[,-1]) 
dt[sel,]