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;を使用した例がすでに1つあります。ここにもう2つあります。

ベース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
于 2012-12-05T08:26:37.037 に答える