2014-12-22 1 views
-1

2 개의 텍스트 파일이 있습니다. File1에는 몇 가지 이름이 포함 된 하나의 열이 있습니다. file2에는 50 개의 열이 있으며 첫 번째 열은 이름을 가지며 다음 열은 값입니다. file1의 모든 이름은 file2에 있습니다 (2는 훨씬 큽니다). file2의 해당 행과 함께 file1의 해당 이름을 찾고 새 파일에서 해당 행을 가져옵니다. 파일 2 :R 또는 파이썬에있는 다른 파일의 행을 기반으로 텍스트 파일의 행을 필터링하십시오.

"ENSG00000000003.10" 17.83196398 69.91920499 
"ENSG00000000419.8" 27.0839105 57.01053354 
"ENSG00000000457.9" 15.09256081 14.86654192 
"ENSG00000000460.12" 3.824827056 11.81359135 
"ENSG00000000938.8" 21.29498307 26.8460545 
"ENSG00000000971.11" 324.9552392 581.2884261 
"ENSG00000001036.9" 51.89359951 77.12018624 
"ENSG00000001084.6" 39.79887612 105.2936106 

FILE1 :

"ENSG00000000003.10" 
"ENSG00000000419.8" 
"ENSG00000000457.9"             

출력 : 파일 가정

"ENSG00000000003.10" 17.83196398 69.91920499 
"ENSG00000000419.8" 27.0839105 57.01053354 
"ENSG00000000457.9" 15.09256081 14.86654192 
+0

메인 Q가 편집 됨 – moin

+0

@moin R에 패키지를 설치하는 방법을 알고 있습니까? –

+0

나는이 패키지를 설치하는 것을 알고있다. 나는 정말로 문제가있다! – moin

답변

1

헤더와 CSV 형식이다. 여기

import pandas as pd 

df1 = pd.read_csv('first_file.csv') 
df2 = pd.read_csv('second_file.csv') 

df3 = df1.merge(df2, on=['Name']) 
print(df3) 
1

library(data.table) 
setkey(setDT(file2), V1)[file1] 
# 1: ENSG00000000003.10 17.83196 69.91920 
# 2: ENSG00000000419.8 27.08391 57.01053 
# 3: ENSG00000000457.9 15.09256 14.86654 
2

dplyr에서 inner_join() 사용 (내가 file2에서 첫 번째 열은 V1라고 가정 있도록 열 이름을 제공하지 않았다)을 data.table 패키지를 사용하여 R 효율적으로이 작업을 수행하는 방법은

library(dplyr) 
d3 <- inner_join(d1, d2, by="name") 

당신이 얻을 :

,536,
> d3 
       name value1 value2 
1 ENSG00000000003.10 17.83196 69.91920 
2 ENSG00000000419.8 27.08391 57.01053 
3 ENSG00000000457.9 15.09256 14.86654 
0

큰 파일을 메모리 맵핑하고 첫 번째 파일의 이름을 사용하여 정규 표현식 검색을 수행하십시오. 나는 당신의 이름이 유일하다고 가정하고 있지만 그렇지 않다면 re.farchall 대신 re.findall을 사용할 수 있습니다. 이 예제는 메모리 맵이 bytearray 객체처럼 동작하는 Python 3.4에서 작동합니다.

import re 
import mmap 
output = [] 
with open('file2.txt', 'r') as f2: 
    mm = mmap.mmap(f2.fileno(), 0, access=mmap.ACCESS_READ) 
    for line in open('file1.txt', 'r'): 
     pattern = bytes(line.rstrip() + ".*", 'utf-8') 
     nameMatch = re.search(pattern, mm) 
     if nameMatch: 
      output.append(str(nameMatch.group(), 'utf-8')) 
    mm.close() 
관련 문제