2017-06-28 13 views
0
df 
     Beginning1 Protein2 Protein3 Protein4 Biomarker1 
Pathway3  A   G   NA   NA   F 
Pathway6  A   G   NA   NA   E 
Pathway1  A   B   C   D    F 
Pathway2  A   B   H   NA   F 
Pathway4  A   B   C   D    E 
Pathway5  A   B   H   NA   F 

私は、上記のデータフレーム(df)を並べ替えることで、タンパク質の経路において最も高い類似性を共有する経路(別名最大類似度2列目:4列目)は、隣り合ってソートされます。データフレームの並び順を並べ替える方法

より明確にするために、私は、出力は次のようになりたいと思います:

newdf 
     Beginning1 Protein2 Protein3 Protein4 Biomarker1 
Pathway6  A   G   NA   NA   E 
Pathway3  A   G   NA   NA   F 
Pathway5  A   B   H   NA   E 
Pathway2  A   B   H   NA   F 
Pathway4  A   B   C   D    E 
Pathway1  A   B   C   D    F 

どのようにしてそれを行うに行きますか?私はユニークな(df)を含むバリエーションを試しましたが、これまでに何も働いていませんでした。

また、このデータセットでは非NA文字の順序で作業するだけですが、私が分析する実際のデータセットには、同じステップ量の何百もの経路があります。

+0

データの画像を投稿しないでください。データを[再現可能な形式]にしておきます(https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – MrFlick

+0

ありがとうございました!私はスタックオーバーフローに慣れていませんでしたし、質問に自分のデータフレームを入力する方法がわかりませんでした。 –

+0

すべての場合にうまくいくわけではありませんが、データをソートするためには、基本R 'order'関数を使用することができます:' df [with(df、order(Beginning1、Protein2、Protein3、Protein4))]] 。 – lmo

答えて

0

ことは、これを試してみてください(ところで:列Biomarker1では、あなたが入力と出力のミスが一致している、私はあなたの所望の出力を得るために、私の理解の上で入力dfベースを修正しました。)

df[is.na(df)]='' 
df$ALL <- do.call(paste0, df[,2:4]) 
df=df[order(rev(df$ALL),rev(df$Biomarker1)),] 
df[df=='']=NA 
df$ALL=NULL 
     Beginning1 Protein2 Protein3 Protein4 Biomarker1 
Pathway6   A  G  <NA>  <NA>   E 
Pathway3   A  G  <NA>  <NA>   F 
Pathway2   A  B  H  <NA>   E 
Pathway5   A  B  H  <NA>   F 
Pathway4   A  B  C  D   E 
Pathway1   A  B  C  D   F 

入力

df

**

#    Beginning1 Protein2 Protein3 Protein4 Biomarker1 
# Pathway3   A  G  <NA>  <NA>   F 
# Pathway6   A  G  <NA>  <NA>   E 
# Pathway1   A  B  C  D   F 
# Pathway2   A  B  H  <NA>   E 
# Pathway4   A  B  C  D   E 
# Pathway5   A  B  H  <NA>   F 

**

+0

それは動作します!ありがとうございました!! –

+0

あなたは鉱山かArtem Sokolovのソリューションを意味します – Wen

+0

両方のソリューションが動作します。私の大きなデータフレームでは若干異なる出力が得られますが、どちらの出力でもデータフレームの編成が増えました。 –

0

使用arrangedplyrパッケージから。 1つまたは複数の列に基づいてデータフレームをソートします。あなたはあなたのポストに要求されるように、降順でソートするdescを使用することができます。

> dplyr::arrange(df, desc(Protein2), desc(Protein3), desc(Protein4)) 

    Beginning1 Protein2 Protein3 Protein4 Biomarker1 
1   A  G  <NA>  <NA>   F 
2   A  G  <NA>  <NA>   E 
3   A  B  H  <NA>   F 
4   A  B  H  <NA>   F 
5   A  B  C  D   F 
6   A  B  C  D   E 

彼らが従うようdplyr操作は、rownamesを保存していない。なおハドレーウィッカムのRは、それらを期待しているためTidy data definitionは(簡単に言うと、rownamesは望ましくありません一意であること)。同等tibble::column_to_rownamesをあります

> tibble::rownames_to_column(df, "Pathway") %>% 
     dplyr::arrange(desc(Protein2), desc(Protein3), desc(Protein4)) 

    Pathway Beginning1 Protein2 Protein3 Protein4 Biomarker1 
1 Pathway3   A  G  <NA>  <NA>   F 
2 Pathway6   A  G  <NA>  <NA>   E 
3 Pathway2   A  B  H  <NA>   F 
4 Pathway5   A  B  H  <NA>   F 
5 Pathway1   A  B  C  D   F 
6 Pathway4   A  B  C  D   E 

あなたが戻ってrownamesを配置する必要がある場合は、それがないと、一般的にお勧めです:あなたは、あなたの経路識別子を追跡するためにtibbleパッケージからrownames_to_columnを使用することができます。

+0

良い解決策! 'アレンジについて学ぶ〜 – Wen

+0

ありがとう!私の小さなデータセットではうまくいきます。より大きい、より複雑なデータセットで試してみましょう。 –

+0

そして、私は間違いなくアレンジを見ていきます。 –

関連する問題