根据R或python中另一个文件的行筛选文本文件中的行

根据R或python中另一个文件的行筛选文本文件中的行,python,r,file,row,Python,R,File,Row,我有两个文本文件。File1有一列包含一些名称。file2有50列,第一列有名称,下一列是值。file1中的所有名称都在file2中。file2要大得多。我正在查找file1的那些名称以及file2中相应的行,并将这些行导入到一个新文件中。 文件2: 文件1: "ENSG00000000003.10" "ENSG00000000419.8" "ENSG00000000457.9" 输出: "EN

我有两个文本文件。File1有一列包含一些名称。file2有50列,第一列有名称,下一列是值。file1中的所有名称都在file2中。file2要大得多。我正在查找file1的那些名称以及file2中相应的行,并将这些行导入到一个新文件中。 文件2:

文件1:

"ENSG00000000003.10"
"ENSG00000000419.8"
"ENSG00000000457.9"                                                  
输出:

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

假设文件为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)

下面是使用data.table包R如何有效地实现这一点您没有提供列名,所以我假设您在文件2中的第一列名为V1

使用来自dplyr的内部连接


内存映射较大的文件,并使用第一个文件的名称进行正则表达式搜索。我假设您的名字是唯一的,但如果不是,您可以使用re.findall而不是re.search。此示例适用于Python3.4,其中内存映射的行为类似于bytearray对象

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()

@moin你知道如何在R中安装软件包吗?我知道,但要安装这个软件包我真的有问题!我正在服务器上工作
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
library(dplyr)
d3 <- inner_join(d1, d2, by="name")
> 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
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()