R 通过合并两个数据帧进行解密

R 通过合并两个数据帧进行解密,r,encryption,merge,dataframe,R,Encryption,Merge,Dataframe,我正在尝试将数据重新映射到他们的加密ID(我不再有权访问将加密ID与参与者ID链接的映射密钥) 在我的例子中,df1有95K行,dh2=94K行,两者都有相同的列(n=360)。我想通过所有列合并df1和df2(具有不同数量的观察值) 对于可再现的示例: df1 = data.frame(PID=c(1:10), Sex = c(rep("male", 4), rep("female", 6)), Age=c(rep("35",2), "27" ,rep("2

我正在尝试将数据重新映射到他们的加密ID(我不再有权访问将加密ID与参与者ID链接的映射密钥)

在我的例子中,df1有95K行,dh2=94K行,两者都有相同的列(n=360)。我想通过所有列合并df1和df2(具有不同数量的观察值)

对于可再现的示例:

df1 = data.frame(PID=c(1:10),
         Sex = c(rep("male", 4), rep("female", 6)),
         Age=c(rep("35",2), "27" ,rep("28", 2), rep("50",2), rep("55", 1), "66", "54")) 


df2 = data.frame(EID=c("PI_1234", "PI_1235", "PI_1236", "PI_1237", "PI_1238"),
    Sex=c("female", "female", "male", "male", "female"),
    Age=c("28", "50", "28", "27", "66") )


df3 =data.frame(PID=c(5, 7, 4, 3, 9), 
    EID=c("PI_1234", "PI_1235", "PI_1236", "PI_1237", "PI_1238"),
    Sex=c("female", "female", "male", "male", "female"),
    Age=c("28", "50", "28", "27", "66") )

我想创建df3,保留所有匹配的观测值(用加密ID(EID)映射PID)。这可能吗

似乎
merge
函数很适合这样做

df3 <- merge(df1, df2)
如果要对列重新排序

df3 <- df3[c(3,4,1,2)]

似乎
merge
函数很适合这样做

df3 <- merge(df1, df2)
如果要对列重新排序

df3 <- df3[c(3,4,1,2)]

这是一个data.table解决方案,它可能比大型数据集上的
merge(…)
更快

library(data.table)
DT1 <- data.table(df1,key=colnames(df1)[-1])
DT2 <- data.table(df2,key=colnames(df2)[-1])
DT1[DT2,nomatch=0]
#    PID    Sex Age     EID
# 1:   5 female  28 PI_1234
# 2:   6 female  50 PI_1235
# 3:   7 female  50 PI_1235
# 4:   9 female  66 PI_1238
# 5:   3   male  27 PI_1237
# 6:   4   male  28 PI_1236
库(data.table)

DT1这是一个data.table解决方案,它可能比大型数据集上的
merge(…)
更快

library(data.table)
DT1 <- data.table(df1,key=colnames(df1)[-1])
DT2 <- data.table(df2,key=colnames(df2)[-1])
DT1[DT2,nomatch=0]
#    PID    Sex Age     EID
# 1:   5 female  28 PI_1234
# 2:   6 female  50 PI_1235
# 3:   7 female  50 PI_1235
# 4:   9 female  66 PI_1238
# 5:   3   male  27 PI_1237
# 6:   4   male  28 PI_1236
库(data.table)

DT1我们如何知道PID 5映射到EID PI_1234,PID 7映射到EID PI_1235,等等?而且您的示例没有与您的描述相同的列,因为PID 6和PID 7在这里都可能匹配,所以我理解re:EID_1235的问题。实际上,我有359个变量可以匹配。考虑到只有一名28岁的女性,EID_1234映射到5岁。我的dataframes的所有列都相同,除了ID列——一个是PID,另一个是加密ID(EID)。如果有两个28岁的女性呢?它们具有相同的ID?您的
df1
具有2行
female-50
行,具有不同的
PID
(6和7)。但是您的结果,
df3
,只有1个
female-50
行(PID=6)。怎么回事?我们怎么知道PID 5映射到EID PI_1234,PID 7映射到EID PI_1235,等等?而且您的示例没有与您的描述相同的列,因为PID 6和PID 7在这里都可能匹配,所以我理解re:EID_1235的问题。实际上,我有359个变量可以匹配。考虑到只有一名28岁的女性,EID_1234映射到5岁。我的dataframes的所有列都相同,除了ID列——一个是PID,另一个是加密ID(EID)。如果有两个28岁的女性呢?它们具有相同的ID?您的
df1
具有2行
female-50
行,具有不同的
PID
(6和7)。但是您的结果,
df3
,只有1个
female-50
行(PID=6)。发生了什么?有没有一种方法可以做到这一点,而不必指定要合并的确切列?我想和每一列合并。是的,我实际上是为了更明确的目的添加了这个。默认情况下,
merge
不接受
By
参数。默认情况下,
By=intersect(names(x),names(y))
有没有一种方法可以做到这一点,而不必指定要合并的确切列?我想和每一列合并。是的,我实际上是为了更明确的目的添加了这个。默认情况下,
merge
不接受
By
参数。默认情况下,
By=intersect(名称(x)、名称(y))