将值从一个数据帧移动到另一个数据帧,具体取决于变量的值

时间:2012-05-02 06:39:25

标签: r merge reshape

不熟悉R,我遇到以下问题:我想将数据框probeposition中的值mlpa添加到数据框patients,其值为{ {1}}通过probepositionmlpa中存在的值进行关联(即patientsprobe)。据我所见,通常的数据管理教程没有涵盖这个问题。

patprobe

更新

在Andrie的回应中,我意识到我必须提到患者数据集中有几个“探针”,所以实际上数据看起来更像这样(事实上,不仅有探针1和probe2,但是probe1-probe4):

#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

我想要的是这个:

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) )

2 个答案:

答案 0 :(得分:2)

您可以使用merge轻松完成此操作,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

来执行此操作
{{1}}

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