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

我肯定会考虑安排,@文! –

相关问题