Anome 发表于 2023-5-5 22:30

水稻MSU和RAP格式ID转换

本帖最后由 Anome 于 2023-5-5 22:34 编辑

### 1.作用
如题,水稻有两种注释,分别是(https://rapdb.dna.affrc.go.jp/)和(http://rice.uga.edu/),分别使用RAP和MSU两种格式的基因ID,RAP格式为“Os-Chr-g-number”,MSU格式为“LOC_Os-Chr-g-number”。有时候需要将它们互相转化。Ensembl plant数据库和RAP-DB数据库都可以在线转换,但是感觉下载不是很方便,所以自己写了一个转换用的脚本。
### 2.用法
- 使用了pandas包,没有安装的需要安装一下。
- 将需要转换的基因id复制到文件raw_id.txt里,一行一个基因ID
- 直接运行脚本即可
- 我是直接判断第一行是不是Os开头的,是就认为是RAP格式,不是就认为是MSU格式,所以第一行不要写其他东西,要符合RAP或者MSU的格式。代码中有注释说明

### 3.文件说明
- **gene_id_conversion.py** 为脚本本身
- **RAP-MSU_2023-03-15.txt** 为从RAP-DB数据库下载的两种ID对应的文件。里面挺多其中一种ID有而另外一种没有。如果数据库中这个有更新,可以自己去下载,然后替换掉这个文件,将代码中读取这个文件的那一行改成新文件。
- **raw_id.txt** 需要将你需要转换的id复制到这里
- **result.txt** 这个是转换成功的,脚本运行结束后打开这个文件copy即可。
- **result_None.txt** 这个对应其中一种id存在而另外一种id不存在的情况,例如基因Os01g0100300在RAP中存在,但是对应到MSU中则没有,为None。
- **result_no_exist.txt** 对应的是不存在这种ID,例如不小心写入了OOOs1323这种错误的id,或者是其他格式的ID,则会写入到这个文件里。
- 我的压缩包里的文件里有内容,是我之前进行转换的时候存在的,可以按照raw_id.txt里的那种进行输入。

### 4.代码
```python
import pandas as pd

# 读取文件
df = pd.read_csv('RAP-MSU_2023-03-15.txt', sep='\t', header=None)

# 获取用户输入。下面这些本来是手动选择转换的形式的,后来来回转换每次都选择太麻烦了,就删除了,可以直接删掉
# col_num = int(input("请输入要转换的形式(输入1或2):\n1:RAP -> MSU\n2:MSU -> RAP\n"))
# search_dir = input("请输入要转换的id所在文件路径:")
# with open(search_dir, "r") as f:
#   search_values = f.read().split()

with open("raw_id.txt", "r") as f:
    search_values = f.read().split()

# 确定要检索的列。同上,可以直接删掉
# if col_num == 1:
#   search_col = 0
#   result_col = 1
# else:
#   search_col = 1
#   result_col = 0

# 我是直接判断第一行是不是Os开头的,是就认为是RAP格式,不是就认为是MSU格式,所以第一行不要写其他东西,要符合RAP或者MSU的格式。
if search_values.startswith("Os"):
    search_col = 0
    result_col = 1
else:
    search_col = 1
    result_col = 0

# 将df转换为字典形式
id_dict = dict(zip(df.iloc[:, search_col], df.iloc[:, result_col]))

# 检索值并输出结果
res = []
res_n = []
no_res = []
for value in search_values:
    if value in id_dict.keys():
      result = id_dict
      if result != "None":
            res.append(result)
      else:
            res_n.append(f"{value} None")
    else:
      no_res.append(f"{value} 不存在")
res = '\n'.join(res)
res_n = '\n'.join(res_n)
no_res = '\n'.join(no_res)
with open("result.txt", "w", encoding="utf-8") as f:
    f.write(res)
with open("result_None.txt", "w", encoding="utf-8") as f:
    f.write(res_n)
with open("result_no_exist.txt", "w", encoding="utf-8") as f:
    f.write(no_res)
```

雾都孤尔 发表于 2023-5-5 22:58

支持原创,感谢分享。

xixicoco 发表于 2023-5-6 06:57

吼吼,是袁隆平搞的东西吗??

Anome 发表于 2023-5-8 14:47

xixicoco 发表于 2023-5-6 06:57
吼吼,是袁隆平搞的东西吗??

啊这,还没那么高级,哈哈,是生信分析用到的一小步,之前用其中一种ID进行的align,后来发现有的功能不能用这种id来实现,只能转成另一种来做。
页: [1]
查看完整版本: 水稻MSU和RAP格式ID转换