根据R或python中另一个文件的行筛选文本文件中的行
我有两个文本文件。File1有一列包含一些名称。file2有50列,第一列有名称,下一列是值。file1中的所有名称都在file2中。file2要大得多。我正在查找file1的那些名称以及file2中相应的行,并将这些行导入到一个新文件中。 文件2: 文件1:根据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
"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()