基于两个变量合并/连接纵向数据

问题描述

我正在尝试合并两个都是长格式的纵向数据。

df1:
patientid visit mental-health
703-FD    1     depressed
703-FD    2     depressed
703-FD    3     depressed
707-NM    1     non-depressed
707-NM    2     non-depressed
707-NM    3     depressed 

df2:
patientid visit HIV_disclosure 
703-FD    1     yes
703-FD    2     yes
703-FD    3     yes
707-NM    1     no
707-NM    2     no
707-NM    3     yes

我尝试过的代码

data_combined <- full_join(x=df1,y=df2,by="patientid"): 

patientid visit.x mental-health  visit.y   HIV disclosure
703-FD    1       depressed      1         yes
703-FD    1       depressed      2         yes
703-FD    1       depressed      3         yes
703-FD    2       depressed      1         yes
703-FD    2       depressed      2         yes
703-FD    2       depressed      3         yes
703-FD    3       depressed      1         yes
703-FD    3       depressed      2         yes
703-FD    3       depressed      3         yes
707-NM    1     non-depressed    1         no
707-NM    1     non-depressed    2         no
707-NM    1     non-depressed    3         yes
707-NM    2     non-depressed    1         no
707-NM    2     non-depressed    2         no
707-NM    2     non-depressed    3         yes
707-NM    3     depressed        1         no
707-NM    3     depressed        2         no
707-NM    3     depressed        3         yes

我如何编辑上面的代码以通过患者 ID 和访问变量进行合并?

我试过了:

library (dplyr)
data_combined <- full_join(x=df1,by="patientid","visit")

所需的加入/合并数据帧:

patientid visit  mental-health  HIV disclosure
703-FD    1       depressed         yes
703-FD    2       depressed         yes
703-FD    3       depressed         yes
707-NM    1     non-depressed       no
707-NM    2     non-depressed       no
707-NM    3       depressed         yes

我确定这是一个简单的代码,但我已经为此苦苦挣扎了一段时间;请帮忙。

解决方法

默认情况下,dplyr 连接函数将通过所有变量进行连接。在您的数据中,这两个变量是 patientidvisit。因此,对于您提供的示例数据,以下简化代码应该有效:

library(dplyr)
data_combined <- full_join(x=df1,y=df2)

如果要指定两列(可能有更多的共同列),则需要为 by = 参数提供一个向量。

data_combined <- full_join(x=df1,y=df2,by = c("patientid","visit"))

您的原始代码仅提供了 by = 'patientid'。由于 'visit' 在逗号之后,full_join() 会尝试将 'visit' 应用于 full_join() 的另一个可能参数。