3

不熟悉 R,我遇到了以下问题:我想将 dataframe 中的值添加probepositionmlpadataframe 中patients,并且probeposition通过值链接的值同时出现在mlpapatients(即probepatprobe)中。据我所知,通常的数据管理教程没有涵盖这个问题。

#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 的回复中,我意识到我不得不提到患者数据集中有几个“探针”,所以实际上数据看起来更像这样(实际上,不仅有 probe1 和 probe2,而且探针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,它采用两个数据框并将它们连接到公共列或行名称上。

开始工作的最简单方法merge是确保您具有匹配的列名称,其中这些列引用相同的信息。具体来说,我已将您的专栏重命名patprobeprobe

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 回答