不熟悉 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
更新
根据 Andrie 的回复,我意识到我不得不提到患者数据集中有几个“探针”,所以实际上数据看起来更像这样(实际上,不仅会有 probe1 和探针 2,但探针 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))
最佳答案
您可以使用 merge
非常轻松地做到这一点,它采用两个数据框并将它们连接到公共(public)列或行名称上。
让 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
的默认值仅返回匹配的行(在数据库术语中,这是一个 inner join)。您想要的是包括 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
关于r - 根据变量的值将值从一个数据帧移动到另一个数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10408864/