質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1466閲覧

DafaFrameから特定の文字を含む要素を見つけ、その要素に別の名前を与える

iziz

総合スコア8

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/04/12 14:03

編集2020/04/13 13:11

下記の2つのテキストファイルがあります。

<gene_name.txt>
ens_gene ext_gene
1 ENSG00000210049 MT-TF
2 ENSG00000211459 MT-RNR1
3 ENSG00000210077 MT-TV
4 ENSG00000210082 MT-RNR2
5 ENSG00000209082 MT-TL1
... ... ...
67136 ENSG00000284921 AC004852.4
67137 ENSG00000285440 AC004852.6
67138 ENSG00000285110 AC004852.5
67139 ENSG00000285363 MTRF1LP2
67140 ENSG00000285114 GSDMC

[67140 rows x 2 columns]

<test_FPKM.txt>
0
0 ENSG00000242268.2
1 ENSG00000270112.3
2 ENSG00000167578.15
3 ENSG00000273842.1
4 ENSG00000078237.5
... ...
60478 ENSG00000105063.17
60479 ENSG00000231119.2
60480 ENSG00000280861.1
60481 ENSG00000123685.7
60482 ENSG00000181518.3

[60483 rows x 1 columns]

test_FPKM.txtの各行からgene_name.txtのens_geneと同じ名前を探し、見つかった場合に該当するext_geneを紐付ける、という作業をしています。
下記のコードを書いてみましたが、一応正しく動いていそうです。

python

1 2import pandas as pd 3 4df = pd.read_table('test_FPKM.txt',index_col=0) 5df2 = pd.read_table('gene_name.txt',index_col=0) 6 7df_gene = pd.DataFrame(df2.iloc[:,0]) 8gene_name_list = [] 9for n in range (len(df)): 10 a = df_gene.iloc[n,0] 11 for p in range (len(df)): 12 b = df.iloc[p,0] 13 if a in b: 14 gene_name = df2.iloc[n,1] 15 gene_name_list.append(gene_name) 16print(gene_name_list) 17 18実行結果→ 19$ gene_name_for_FPKM.py 20['MT-RNR1', 'MT-TL1', 'MT-ND1', 'MIR8081', 'RNU1-47P', 'RNU6-919P', 'RN7SL193P', 'AC006963.1', 'RNA5SP183', 'AC006960.1', 'AC096917.1', 'RNVU1-2A', 'RN7SL541P'] 21

2つのファイルは行数が異なります。
また、<test_FPKM.txt>に含まれる文字列は、<gene_name.txt>のens_gene列に小数点以下の数字が付与されています。

ただ、全本のファイルはそれぞれ65,000行くらいあり、全体のデータで処理すると動きません。
もっと効率良いコードにするにはどのように改変すればよいか、教えていただければと思います。
また、Linuxコマンドでもできそうな気がするのですが、ご存知のかたいたらよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shimiken

2020/04/12 14:20

merge関数ではダメですか?
shimiken

2020/04/12 14:21

↑Rの関数です
iziz

2020/04/13 13:45

ありがとうございます。merge関数使ったことないので、調べておきます。 また、説明が悪かったのですが、2つのファイルは共通点はありますが、行数も異なり部分的に一致する文字列が含まれるという状況です。 この場合はmerge関数は使えないのかなと思ったのですが、可能でしょうか?
shimiken

2020/04/13 14:10

行数異なっていてもmerge関数は使えます。 ただ、部分一致では今回の目的のためにそのままmerge関数は使えません。 ENSG00000242268.2をピリオドで区切って、 ENSG00000242268と2に分ければ完全一致させることができるので、merge関数でいけると思います。
iziz

2020/04/13 14:57

ありがとうございます。split使えばなんとかいけそうですのでやってみます。
guest

回答2

0

mergeで書くか、

python

1>>> import pandas as pd 2>>> a = pd.DataFrame({"A":["aiueo", "abc"], "B":["123", "456"]}) 3>>> b = pd.DataFrame({"Data":["aiueo", "abc", "def"]}) 4>>> b.merge(a, left_on="Data", right_on="A") 5 Data A B 60 aiueo aiueo 123 71 abc abc 456 8

mapで書くか、

python

1>>> tab = a.set_index("A") 2>>> b["Data"].map(tab["B"]) 30 123 41 456 52 NaN 6Name: Data, dtype: object 7

投稿2020/04/12 23:46

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iziz

2020/04/13 13:52

ありがとうございます。merge関数もmap関数も使ったことないので勉強しておきます。 他の方にも回答させて頂きましたが、merge関数は共通文字列が含まれるか判定して、含まれる場合に対応する値を追加する機能はあるのでしょうか
guest

0

下記のコードで解決できました。ありがとうございました。

python

1df = pd.read_table('test_FPKM.txt',index_col=0) 2df2 = pd.read_table('gene_name.txt',index_col=0) 3dfs=df.sort_values('0') 4df2s=df2.sort_values('ens_gene') 5>>> dfs 6 0 751435 ENSG00000000003.13 857921 ENSG00000000005.5 953855 ENSG00000000419.11 1043302 ENSG00000000457.12 1154619 ENSG00000000460.15 12... ... 1353680 ENSGR0000275287.3 1422858 ENSGR0000276543.3 1511371 ENSGR0000277120.3 1628847 ENSGR0000280767.1 1719235 ENSGR0000281849.1 18 19[60483 rows x 1 columns] 20>>> df2s 21 ens_gene ext_gene 2218950 ENSG00000000003 TSPAN6 2318862 ENSG00000000005 TNMD 2438595 ENSG00000000419 DPM1 2526993 ENSG00000000457 SCYL3 2627032 ENSG00000000460 C1orf112 27... ... ... 2856126 ENSG00000288584 Z97205.3 294672 ENSG00000288585 AC010184.1 3019040 ENSG00000288586 AL357874.3 3116487 ENSG00000288587 AL645933.5 3238985 ENSG00000288588 AC116317.2 33 34[67140 rows x 2 columns] 35 36# rename index in numerical order to use concat method 37name = list(range(0,len(dfs))) 38name2 = list(range(0,len(df2s))) 39dfs.index = name 40df2s.index = name2 41df_df2 = pd.concat([dfs,df2s],axis=1) 42 43df_df2 44 0 ens_gene ext_gene 450 ENSG00000000003.13 ENSG00000000003 TSPAN6 461 ENSG00000000005.5 ENSG00000000005 TNMD 472 ENSG00000000419.11 ENSG00000000419 DPM1 483 ENSG00000000457.12 ENSG00000000457 SCYL3 494 ENSG00000000460.15 ENSG00000000460 C1orf112 50... ... ... ... 5167135 NaN ENSG00000288584 Z97205.3 5267136 NaN ENSG00000288585 AC010184.1 5367137 NaN ENSG00000288586 AL357874.3 5467138 NaN ENSG00000288587 AL645933.5 5567139 NaN ENSG00000288588 AC116317.2 56 57[67140 rows x 3 columns] 58 59#remove rows including NaN 60df_df2 = df_df2[df_df2.GC_sample != null] 61

投稿2020/04/13 13:34

iziz

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問