2

我正在使用以下数据集在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)的行中具有相同名称的化合物(例如戊酮)。从这个选择中,我想复制与最高相似性对应的行信息并在表中创建新列。在这种情况下,以下信息:

120 Pentanone   153744  PO2:1   981

我知道“向我发送代码帖子”并不是很受欢迎,我将非常感谢一些有关如何开始的线索。

4

2 回答 2

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)
  1. 我将我的 data.frame 拆分为 (first & Name)
  2. 我将函数应用于每组行
  3. 我在一个新的 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
    
于 2012-12-05T00:44:47.287 回答
1

有很多选择。您已经有一个使用plyr;的示例 这里还有两个。

Base R 方法,使用aggregateand 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
于 2012-12-05T08:26:37.037 回答