匹配发生后的子集

时间:2012-11-12 16:59:08

标签: r

我有这样的数据框(特别是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中哪个元素与该数字相关联?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
    
  4. 更新

    借用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
      
    4. 这种“更宽”的data.frame可能会更方便您使用。