1

2 つの data.frames があります (ここでは、大きすぎるためサブセットのみが報告されています)。

DF1:

  "G1"           "G2"  
  IL3RA          ABCC1      
  SRSF9          ADAM19     
  IL22RA2        BIK 
  UROD           ALG3
  SLC35C2        GGH
  OR12D3         SEC31A    
  OSBPL3         HIST1H2BK       

DF2:

  "S1"            "S2"     "S3"
  IL3RA            0        0      
  SRSF9            1        1       
  A1CF             0        0       
  A1CF1            1        1       
  GGH              2        0        
  HIST1H2BK        0        0          
  AAK1             0        0    

次の出力が必要です。

  "G1"            "S2"   "S3"     "G2"   "S2"   "S3"
  IL3RA            0      0        GGH     2      0 
  SRSF9            1      1     HIST1H2BK  0      0

別の同様の状況で提案された機能を適用しました。機能は次のとおりです。

lapply(DF1, function(x) DF2[na.omit(match(DF2[[1]], x)), ])

驚くべきことに、この場合は機能しません。理由は本当にわかりません..新しいデータで「data.frameの列を%in%オーバーする」というタイトルの投稿に投稿されたケースを正確に再現しましたが、何もしませんでした。DF1 と DF2 は大きすぎるので、クラスターを使用して、問題が使用可能なメモリにあると仮定して、より多くのメモリを使用しようとしましたが、何もありませんでした。それが与える出力は次のとおりです。

  "S1"            "S2"     "S3"
  IL3RA            0        0      
  SRSF9            1        1       


  "S1"            "S2"     "S3"
  GGH              2        0      
  AAK1             0        0       

誰でも私を助けてもらえますか?

一番

B.

4

1 に答える 1

1

これでうまくいくはずです。

df1 <- structure(list(G1 = c("IL3RA", "SRSF9", "IL22RA2", "UROD", "SLC35C2", 
"OR12D3", "OSBPL3"), G2 = c("ABCC1", "ADAM19", "BIK", "ALG3", 
"GGH", "SEC31A", "HIST1H2BK")), .Names = c("G1", "G2"), class = "data.frame", row.names = c(NA, 
-7L))
df2 <- structure(list(S1 = c("IL3RA", "SRSF9", "A1CF", "A1CF1", "GGH", 
"HIST1H2BK", "AAK1"), S2 = c(0L, 1L, 0L, 1L, 2L, 0L, 0L), S3 = c(0L, 
1L, 0L, 1L, 0L, 0L, 0L)), .Names = c("S1", "S2", "S3"), class = "data.frame", row.names = c(NA, 
-7L))

idx1 <- match(df1$G1, df2$S1)
idx1 <- idx1[!is.na(idx1)]
idx2 <- match(df1$G2, df2$S1)
idx2 <- idx2[!is.na(idx2)]

out <- cbind(df2[idx1, ], df2[idx2, ])
> out
     S1 S2 S3        S1 S2 S3
1 IL3RA  0  0       GGH  2  0
2 SRSF9  1  1 HIST1H2BK  0  0

編集:を使用したソリューションlapply

out <- lapply(df1, function(x) {
    idx <- match(x, df2$S1)
    idx <- idx[!is.na(idx)]
    df2[idx, ]
})
# now `out` is a list of data.frames
out.f <- do.call(cbind, out)
# they'll be combined by columns
  G1.S1 G1.S2 G1.S3     G2.S1 G2.S2 G2.S3
1 IL3RA     0     0       GGH     2     0
2 SRSF9     1     1 HIST1H2BK     0     0
于 2013-01-16T11:57:12.680 に答える