0

私はこのようなデータフレームを持っています(具体的にはdata.frameには50列が含まれています):

  "G1"            "G2"  
  SEP11          ABCC1   
  0.1365         0.1858   
  214223_at      ADAM19     
  0.1305         0.131   
  COPS4          BIK 
  0.1271         0.1143
  ACE            ALG3
  0.1333         0.119
  EMP3           GGH
  0.1246         0.1214

そしてこのような別のdata.frame(具体的にはdata.frameには50列が含まれています):

   "G1"           "G2"  
  0.1365         0.1858   
  0.1271         0.1143    
  0.1246         0.1214 

次の出力が欲しいです:

  "G1"           "G2"  
 SEP11          ABCC1  
 0.1365         0.1858  
 COPS4          BIK     
 0.1271         0.1143   
 EMP3           GGH
 0.1246         0.1214 

誰か助けてくれませんか?

基本的に、Rはdata.frame 1の「0.1365」とdata.frame2の「0.1365」の一致を見つけた後、一致が存在する番号とその番号に関連付けられたdata.frame1から対応する名前を抽出します。質問に答えたいので:data.frame1のどの要素がその番号に関連付けられていますか?

4

2 に答える 2

1
df1 <- read.table(text=" G1            G2  
  SEP11          ABCC1   
  0.1365         0.1858   
  214223_at      ADAM19     
  0.1305         0.131   
  COPS4          BIK 
  0.1271         0.1143
  ACE            ALG3
  0.1333         0.119
  EMP3           GGH
  0.1246         0.1214",header=TRUE,stringsAsFactors=FALSE)

df2 <- read.table(text="G1           G2  
      0.1365         0.1858   
      0.1271         0.1143    
      0.1246         0.1214 
 ",header=TRUE,stringsAsFactors=FALSE)

#separate names and numbers
df1a <- df1[seq(from=1,to=nrow(df1)-1,by=2),]
df1b <- df1[seq(from=2,to=nrow(df1),by=2),]

#look up and merge again
df <- rbind(df1b[apply(df1b,1,paste,collapse=",") %in% apply(df2,1,paste,collapse=","),],
            df1a[apply(df1b,1,paste,collapse=",") %in% apply(df2,1,paste,collapse=","),])
df <- df[order(as.numeric(rownames(df))),]
#       G1     G2
#1   SEP11  ABCC1
#2  0.1365 0.1858
#5   COPS4    BIK
#6  0.1271 0.1143
#9    EMP3    GGH
#10 0.1246 0.1214
于 2012-11-12T17:02:14.207 に答える
0

データが行のペアであると仮定すると、これは機能するはずです。

  1. あなたのデータ:

    df1 <- read.table(header = TRUE, text = '  "G1"            "G2"
                      SEP11          ABCC1
                      0.1365         0.1858
                      214223_at      ADAM19
                      0.1305         0.131
                      COPS4          BIK
                      0.1271         0.1143
                      ACE            ALG3
                      0.1333         0.119
                      EMP3           GGH
                      0.1246         0.1214')
    df2 <- read.table(header = TRUE, text = ' "G1"           "G2"
                      0.1365         0.1858
                      0.1271         0.1143
                      0.1246         0.1214 ')
    
  2. 指定されたデータと前の行のデータを照合します

    myMatch <- which(df1$G1 %in% df2$G1)
    myMatch <- sort(c(myMatch, myMatch-1))
    
  3. サブセット化。

    df1[myMatch, ]
    #        G1     G2
    # 1   SEP11  ABCC1
    # 2  0.1365 0.1858
    # 5   COPS4    BIK
    # 6  0.1271 0.1143
    # 9    EMP3    GGH
    # 10 0.1246 0.1214
    

アップデート

Rolandのアプローチから少し借用して、複数の列にまたがって一致させようとしている場合は、実際mergeに、より適切なアプローチである可能性があります。残念ながら、現在、データは簡単にマージできる形式ではありませんが、簡単に修正することもできます。

  1. data.frame名前と値を分離し、出力を実行して、「df1」を「修正」しますcbind

    df1.new <- cbind(df1[seq(from = 1, to = nrow(df1), by = 2), ], 
                     df1[seq(from = 2, to = nrow(df1), by = 2), ])
    
  2. データの前半の列の名前を変更して、それらが名前であることを示します。データの後半の列は、マージのために保持されます。

    names(df1.new)[1:(ncol(df1.new)/2)] <- 
      paste(names(df1.new[1:(ncol(df1.new)/2)]), "Name", sep = ".")
    df1.new
    #     G1.Name G2.Name     G1     G2
    # 1     SEP11   ABCC1 0.1365 0.1858
    # 3 214223_at  ADAM19 0.1305  0.131
    # 5     COPS4     BIK 0.1271 0.1143
    # 7       ACE    ALG3 0.1333  0.119
    # 9      EMP3     GGH 0.1246 0.1214
    
  3. merge()データの「サブセット」を取得するために使用します。

    merge(df1.new, df2)
    #       G1     G2 G1.Name G2.Name
    # 1 0.1246 0.1214    EMP3     GGH
    # 2 0.1271 0.1143   COPS4     BIK
    # 3 0.1365 0.1858   SEP11   ABCC1
    

この「幅の広い」data.frame方が、一般的に使用するのに便利な場合があります。

于 2012-11-12T17:02:31.890 に答える