2017-06-28 180 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

謝謝!我是Stack Overflow的新手,不確定如何在問題中輸入我的數據框。 –

+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

使用dplyr包中的arrange。它會根據一列或多列對數據框進行排序。您可以使用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,因爲他們遵循哈德利韋翰的Tidy data definition(簡言之,rownames是不可取的,因爲R他們希望是獨一無二的)。您可以使用rownames_to_columntibble包,讓您的途徑標識符的軌跡:

> 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 

有同等tibble::column_to_rownames如果你需要把rownames回來,但一般最好不要。

+0

好解決方案!瞭解'排列'〜 – Wen

+0

謝謝!這適用於我的小數據集。我會嘗試使用我的更大,更復雜的數據集並回復你! –

+0

我肯定會考慮安排,@文! –

相關問題