我正在 R 中使用以下数据集进行代谢组学研究。
first Name Area Sample Similarity
120 Pentanone 699468 PO4:1 954
120 Pentanone 153744 PO2:1 981
126 Methylamine 83528 PO4:1 887
126 Unknown 32741 PO2:1 645
126 Sulfurous 43634 PO1:1 800
我希望能够在第一列中,在具有相同值(例如120)的rowns中选择具有相同名称的化合物(例如pentanone)。从这个选择我想复制对应于最高相似性的行信息,并在表中创建新列。在这种情况下,以下信息:
120 Pentanone 153744 PO2:1 981
我知道“发送给我的代码帖子”并不是非常感激,我非常感谢有关如何开始的一些线索。
答案 0 :(得分:2)
您可以使用plyr包:
我重现你的数据(下次尝试使用dput(dat))
dat <- read.table(text ='first Name Area Sample Similarity
120 Pentanone 699468 PO4:1 954
120 Pentanone 153744 PO2:1 981
126 Methylamine 83528 PO4:1 887
126 Unknown 32741 PO2:1 645
126 Sulfurous 43634 PO1:1 800',header=TRUE)
我汇总了一个新的data.frame
library(plyr)
ddply(dat,.(first,Name),function(x) x[x$Similarity==max(x$Similarity),])
first Name Area Sample Similarity
1 120 Pentanone 153744 PO2:1 981
2 126 Methylamine 83528 PO4:1 887
3 126 Sulfurous 43634 PO1:1 800
4 126 Unknown 32741 PO2:1 645
答案 1 :(得分:1)
有很多选择。您已经有一个使用plyr
的示例;还有两个。
基础R方法,使用aggregate
和merge
:
merge(dat, aggregate(Similarity ~ first + Name, dat, max))
# first Name Similarity Area Sample
# 1 120 Pentanone 981 153744 PO2:1
# 2 126 Methylamine 887 83528 PO4:1
# 3 126 Sulfurous 800 43634 PO1:1
# 4 126 Unknown 645 32741 PO2:1
sqldf
方法:
library(sqldf)
sqldf("select *, max(Similarity) `Similarity` from dat group by first, Name")
# first Name Similarity Area Sample
# 1 120 Pentanone 981 153744 PO2:1
# 2 126 Methylamine 887 83528 PO4:1
# 3 126 Sulfurous 800 43634 PO1:1
# 4 126 Unknown 645 32741 PO2:1