根据在多个 CSV 文件中找到的分类群频率创建 table
Create a table from the frequencies of taxa found in multiple CSV files
我有 12 个 .csv
文件,其中包含获取的分类名称及其频率(每个名称被获取的次数)。我创建了一个 .txt
主文件,列出了在 12 个文件中至少发现一次的所有独特分类单元。我需要以 csv
格式制作一个串联的 table,其中行的 headers 是每个文件的名称,列的 headers 都是唯一的分类单元列在主 .txt
文件中。 table 必须用每个 .csv
输入文件中每个分类群旁边的频率填充。虽然主列表包含 12 个文件中可能的所有分类单元,但并非所有文件都包含所有分类单元。当分类单元丢失时,我需要放置一个“0”。
.csv
输入:
$cat file_1
1,Salmo salar
12,Solanum pennellii
18,Staphylococcus xylosus
...
$cat file_2
1,Salmo salar
14,Staphylococcus xylosus
123,Strongyloides stercoralis
...
$cat file_3
123,Solanum pennellii
11,Staphylococcus xylosus
41,Strongyloides stercoralis
...
.txt
主列表:
$cat master
Salmo salar
Solanum pennellii
Staphylococcus xylosus
Strongyloides stercoralis
...
.csv
输出(我需要的):
Sample,Salmo salar,Solanum pennellii,Staphylococcus xylosus,Strongyloides stercoralis
File_1,1,12,18,0
File_2,1,0,14,123
File_3,0,123,11,41
我之前尝试制作一个没有主列表的小 python 脚本,并使用 .tsv
输入文件包含重复的分类单元名称而不是频率。我无法获得显示每个文件缺少分类单元的 table,因此我决定创建一个主列表并折叠输入文件。我是 python 的新手,所以我们将不胜感激。
您根本不需要主文件。我只是动态生成最终的 table 。假设您将输入文件名作为命令行参数传递给 Python 脚本:
import sys
from collections import defaultdict
data = defaultdict(dict) # { taxon: { filename: count } }
for filename in sys.argv[1:]:
with open(filename) as infile:
for line in infile:
count, taxon = line.rstrip().split(',')
data[taxon][filename] = count
现在您有 data
,这是您输出文件所需的一切。然后你可以像这样打印它:
taxa = data.keys()
print "Sample,{}".format(','.join(taxa))
for filename in sys.argv[1:]:
print filename,
for taxon in taxa:
count = data[taxon].get(filename, "0")
sys.stdout.write("," + count)
print
尝试使用 csv.Dictwriter。
- 将您拥有的 12 个文件读入格式为 filename = {species_name: count, species_name:count}.
的字典中
- 将 master_list txt 文件读入列表
- 使用 csv.Dictwriter 将从您创建的词典中写入一个 csv 文件。您可以指定它放置一个 0,以防文件中没有某个物种的数据。您 headers 将是来自 master_list 的物种列表。
对于那些即将awk
的人,我们向你们致敬!
awk
就是为这样的处理而创建的。
试试这个:
awk -F "," -v OFS="," '
FNR==1 {samples[++fni]=FILENAME}
{if (!taxakeys[]) {taxakeys[]=1; taxas[++ti]=};frequencies[samples[fni],]+=}
END {
printf("Sample"); for (j=1;j<=ti;j++) { printf("%s%s",OFS,taxas[j])}; printf("\n")
for (i=1; i<=fni; i++) {
printf("%s",samples[i]); for (j=1;j<=ti;j++) { printf("%s%d",OFS,frequencies[samples[i],taxas[j]])}; printf("\n")
}
}'
测试:
$ awk -F "," -v OFS="," '
FNR==1 {samples[++fni]=FILENAME}
{if (!taxakeys[]) {taxakeys[]=1; taxas[++ti]=};frequencies[samples[fni],]+=}
END {
printf("Sample"); for (j=1;j<=ti;j++) { printf("%s%s",OFS,taxas[j])}; printf("\n")
for (i=1; i<=fni; i++) {
printf("%s",samples[i]); for (j=1;j<=ti;j++) { printf("%s%d",OFS,frequencies[samples[i],taxas[j]])}; printf("\n")
}
}' file_*
Sample,Salmo salar,Solanum pennellii,Staphylococcus xylosus,Strongyloides stercoralis
file_1,1,12,18,0
file_2,1,0,14,123
file_3,0,123,11,41
我有 12 个 .csv
文件,其中包含获取的分类名称及其频率(每个名称被获取的次数)。我创建了一个 .txt
主文件,列出了在 12 个文件中至少发现一次的所有独特分类单元。我需要以 csv
格式制作一个串联的 table,其中行的 headers 是每个文件的名称,列的 headers 都是唯一的分类单元列在主 .txt
文件中。 table 必须用每个 .csv
输入文件中每个分类群旁边的频率填充。虽然主列表包含 12 个文件中可能的所有分类单元,但并非所有文件都包含所有分类单元。当分类单元丢失时,我需要放置一个“0”。
.csv
输入:
$cat file_1
1,Salmo salar
12,Solanum pennellii
18,Staphylococcus xylosus
...
$cat file_2
1,Salmo salar
14,Staphylococcus xylosus
123,Strongyloides stercoralis
...
$cat file_3
123,Solanum pennellii
11,Staphylococcus xylosus
41,Strongyloides stercoralis
...
.txt
主列表:
$cat master
Salmo salar
Solanum pennellii
Staphylococcus xylosus
Strongyloides stercoralis
...
.csv
输出(我需要的):
Sample,Salmo salar,Solanum pennellii,Staphylococcus xylosus,Strongyloides stercoralis
File_1,1,12,18,0
File_2,1,0,14,123
File_3,0,123,11,41
我之前尝试制作一个没有主列表的小 python 脚本,并使用 .tsv
输入文件包含重复的分类单元名称而不是频率。我无法获得显示每个文件缺少分类单元的 table,因此我决定创建一个主列表并折叠输入文件。我是 python 的新手,所以我们将不胜感激。
您根本不需要主文件。我只是动态生成最终的 table 。假设您将输入文件名作为命令行参数传递给 Python 脚本:
import sys
from collections import defaultdict
data = defaultdict(dict) # { taxon: { filename: count } }
for filename in sys.argv[1:]:
with open(filename) as infile:
for line in infile:
count, taxon = line.rstrip().split(',')
data[taxon][filename] = count
现在您有 data
,这是您输出文件所需的一切。然后你可以像这样打印它:
taxa = data.keys()
print "Sample,{}".format(','.join(taxa))
for filename in sys.argv[1:]:
print filename,
for taxon in taxa:
count = data[taxon].get(filename, "0")
sys.stdout.write("," + count)
print
尝试使用 csv.Dictwriter。
- 将您拥有的 12 个文件读入格式为 filename = {species_name: count, species_name:count}. 的字典中
- 将 master_list txt 文件读入列表
- 使用 csv.Dictwriter 将从您创建的词典中写入一个 csv 文件。您可以指定它放置一个 0,以防文件中没有某个物种的数据。您 headers 将是来自 master_list 的物种列表。
对于那些即将awk
的人,我们向你们致敬!
awk
就是为这样的处理而创建的。
试试这个:
awk -F "," -v OFS="," '
FNR==1 {samples[++fni]=FILENAME}
{if (!taxakeys[]) {taxakeys[]=1; taxas[++ti]=};frequencies[samples[fni],]+=}
END {
printf("Sample"); for (j=1;j<=ti;j++) { printf("%s%s",OFS,taxas[j])}; printf("\n")
for (i=1; i<=fni; i++) {
printf("%s",samples[i]); for (j=1;j<=ti;j++) { printf("%s%d",OFS,frequencies[samples[i],taxas[j]])}; printf("\n")
}
}'
测试:
$ awk -F "," -v OFS="," '
FNR==1 {samples[++fni]=FILENAME}
{if (!taxakeys[]) {taxakeys[]=1; taxas[++ti]=};frequencies[samples[fni],]+=}
END {
printf("Sample"); for (j=1;j<=ti;j++) { printf("%s%s",OFS,taxas[j])}; printf("\n")
for (i=1; i<=fni; i++) {
printf("%s",samples[i]); for (j=1;j<=ti;j++) { printf("%s%d",OFS,frequencies[samples[i],taxas[j]])}; printf("\n")
}
}' file_*
Sample,Salmo salar,Solanum pennellii,Staphylococcus xylosus,Strongyloides stercoralis
file_1,1,12,18,0
file_2,1,0,14,123
file_3,0,123,11,41