3

probepositionR に慣れていないので、次の問題があります。 dataframemlpaからdataframe に値を追加したいのですが、と(つまりと) の両方に存在するpatientsprobepositionによってリンクされています。私が見た限りでは、この問題は通常のデータ管理チュートリアルではカバーされていません。mlpapatientsprobepatprobe

#mlpa:
probe <- c(12,15,18,19)
probeposition <- c(100,1200,500,900)
mlpa = data.frame(probe = probe, probeposition = probeposition)
#patients:
patid <- c('AT', 'GA', 'TT', 'AG', 'GG', 'TA')
patprobe <- c(12, 12, NA, NA, 18, 19)
patients = data.frame(patid = patid, patprobe = patprobe)

#And that's what I finally want:
patprobeposition = c(100, 100, NA, NA, 500, 900)  
patients$patprobeposition = patprobeposition

アップデート

Andrie の回答を受けて、患者のデータセットにはいくつかの「プローブ」があることに言及する必要があることに気付きました。そのため、実際のデータは次のようになります (実際には、プローブ 1 とプローブ 2 だけでなく、プローブ 1 ~ プローブ 4):

mlpa <- data.frame(probe = c(12,15,18,19),
                   probeposition = c(100,1200,500,900) ) 
patients <- data.frame(patid = c('AT', 'GA', 'TT', 'AG', 'GG', 'TA'),
                       probe1 = c(12, 12, NA, NA, 18, 19), 
                       probe2 = c(15, 15, NA, NA, 19, 19) )

そして、私が欲しいのはこれです:

patients <- data.frame(patid = c('AT', 'GA', 'TT', 'AG', 'GG', 'TA'),   
                       probe1 = c(12, 12, NA, NA, 18, 19), 
                       probe2 = c(15, 15, NA, NA, 19, 19), 
                       position1 = c(100, 100, NA, NA, 500, 900), 
                       position2 = c(1200, 1200, NA, NA, 900, 900)) 
4

2 に答える 2

2

を使用すると、これを非常に簡単に行うことができます。これmergeは、2 つのデータ フレームを取り、それらを共通の列または行名で結合します。

作業を開始する最も簡単な方法mergeは、それらの列が同じ情報を参照する列名が一致していることを確認することです。具体的には、列の名前を次のように変更patprobeしましたprobe

mlpa <- data.frame(
  probe = c(12,15,18,19),
  probeposition = c(100,1200,500,900)
)

patients <- data.frame(
  patid = c('AT', 'GA', 'TT', 'AG', 'GG', 'TA'),
  probe = c(12, 12, NA, NA, 18, 19)
)

これで、 を呼び出すことができますmerge。ただし、 のデフォルト値mergeは一致する行のみを返すことに注意してください (データベース用語では、これは内部結合です)。必要なのは、すべての行を含めることですpatients(左外部結合)。これを行うには、次を指定しall.x=TRUEます。

merge(patients, mlpa, all.x=TRUE, sort=FALSE)

  probe patid probeposition
1    12    AT           100
2    12    GA           100
3    18    GG           500
4    19    TA           900
5    NA    TT            NA
6    NA    AG            NA
于 2012-05-02T06:50:03.887 に答える
0

reshape2パッケージをインストールして、次のことを試してください。

require(reshape2)
m.patients = melt(patients)
m.patients = merge(m.patients, mlpa, 
                   by.x = "value", 
                   by.y = "probe", 
                   all = TRUE)
reshape(m.patients, direction="wide", 
        timevar="variable", idvar="patid")

これにより、次のような出力が得られます。これは、目的の出力に一致するようにクリーンアップできます。

   patid value.probe1 probeposition.probe1 value.probe2 probeposition.probe2
1     AT           12                  100           15                 1200
2     GA           12                  100           15                 1200
5     GG           18                  500           19                  900
7     TA           19                  900           19                  900
9     TT           NA                   NA           NA                   NA
10    AG           NA                   NA           NA                   NA

アップデート

もちろん、reshape2以下のようにパッケージを使用してすべて実行することもできます。

m.patients = melt(patients, id.vars="patid", variable_name="time")
m.patients = melt(merge(m.patients, mlpa, by.x = "value", 
                        by.y = "probe", all = TRUE))
dcast(m.patients, patid ~ variable + time )

結果は次のとおりです。

  patid value_probe1 value_probe2 probeposition_probe1 probeposition_probe2
1    AG           NA           NA                   NA                   NA
2    AT           12           15                  100                 1200
3    GA           12           15                  100                 1200
4    GG           18           19                  500                  900
5    TA           19           19                  900                  900

更新 2: Base R Reshape の使用

reshape2パッケージ全体の使用を避けることもできます。

patients.l = reshape(patients, direction="long", idvar="patid", 
                     varying=c("probe1", "probe2"), sep="")
reshape(merge(patients.l, mlpa, all = TRUE), direction="wide", 
        idvar="patid", timevar="time")

これにより、目的の出力に最も近くなります。

   patid probe.1 probeposition.1 probe.2 probeposition.2
1     AT      12             100      15            1200
2     GA      12             100      15            1200
5     GG      18             500      19             900
7     TA      19             900      19             900
9     TT      NA              NA      NA              NA
10    AG      NA              NA      NA              NA
于 2012-05-02T11:30:21.487 に答える