R 根据变量的值将值从一个数据帧移动到另一个数据帧
由于不熟悉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
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