不熟悉R,我遇到以下问题:我想将数据框probeposition
中的值mlpa
添加到数据框patients
,其值为{ {1}}通过probeposition
和mlpa
中存在的值进行关联(即patients
和probe
)。据我所见,通常的数据管理教程没有涵盖这个问题。
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) )
答案 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
您还可以完全避免使用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