Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据变量的值将值从一个数据帧移动到另一个数据帧_R_Merge_Reshape - Fatal编程技术网

R 根据变量的值将值从一个数据帧移动到另一个数据帧

R 根据变量的值将值从一个数据帧移动到另一个数据帧,r,merge,reshape,R,Merge,Reshape,由于不熟悉R,我遇到了以下问题:我想将数据帧mlpa中的值probeposition添加到数据帧patients,其中probeposition的值通过mlpa和patients中的值进行链接(即probe和patprobe)。据我所知,通常的数据管理教程并未涵盖此问题 #mlpa: probe <- c(12,15,18,19) probeposition <- c(100,1200,500,900) mlpa = data.frame(probe = probe, probepo

由于不熟悉R,我遇到了以下问题:我想将数据帧
mlpa
中的值
probeposition
添加到数据帧
patients
,其中
probeposition
的值通过
mlpa
patients
中的值进行链接(即
probe
patprobe
)。据我所知,通常的数据管理教程并未涵盖此问题

#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:

探测使用
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)
)

安装
重塑2
软件包并尝试以下操作:

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
更新 当然,您也可以使用
reformae2
软件包完成这一切,如下所示:

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:使用基本R形状 您还可以避免完全使用
reformae2

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

谢谢Andrie!不幸的是,我没有意识到我必须提到在患者数据集中有几个“探测”(请参见问题中的编辑)。据我所知,merge()在这种情况下不起作用,对吗?
  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
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