R 如何';加入';数据帧是否在集合中找到编号?
因此,对于我目前正在进行的一个项目,我有一个数字的数据框架(称之为a)。data.frame A由1个变量和300000行不同的数字组成 除了A之外,我还有data.frame B和C。data frame B和C都有315个变量,并且共享相同的结构(数据类型相同,但值/变量名不同) A、 B和C都共享相同的第一个变量,这是它们的主键。A包含整个数字列表,B和C都包含此列表的子集 我想做的是,将B和C中第一个变量中的数字与A中的数字匹配,如果它们匹配,那么B和C中所属行的所有数据都应该放入A中 在SQL中,我知道可以根据匹配的结果更新表并添加行。但是,我不允许在这个任务中使用任何SQL命令(因此我不能使用sqldf库),我也不知道如何在R中这样做 例如,假设您有以下带有信息的数据帧: A B C 这将导致: AR 如何';加入';数据帧是否在集合中找到编号?,r,R,因此,对于我目前正在进行的一个项目,我有一个数字的数据框架(称之为a)。data.frame A由1个变量和300000行不同的数字组成 除了A之外,我还有data.frame B和C。data frame B和C都有315个变量,并且共享相同的结构(数据类型相同,但值/变量名不同) A、 B和C都共享相同的第一个变量,这是它们的主键。A包含整个数字列表,B和C都包含此列表的子集 我想做的是,将B和C中第一个变量中的数字与A中的数字匹配,如果它们匹配,那么B和C中所属行的所有数据都应该放入A中
我们可以使用嵌套的
merge
merge(merge(A, B, by.x = "KEY", by.y = "B_KEY", all.x = TRUE), C,
by.x = "KEY", by.y = "C_KEY", all.x = TRUE)
但是,如果我们在所有数据帧中保持“KEY”列的列名相同,则使用Reduce
names(B)[1] <- "KEY"
names(C)[1] <- "KEY"
Reduce(function(x, y) merge(x, y, all.x = TRUE), list(A, B, C))
# KEY VAR_B_2 VAR_B_3 VAR_C_2 VAR_C_3
#1 1 <NA> NA <NA> NA
#2 2 AB 134 BD 250
#3 3 <NA> NA BE 251
#4 4 AC 135 <NA> NA
#5 5 <NA> NA BF 252
#6 6 <NA> NA <NA> NA
#7 7 AD 136 BG 253
names(B)[1]对无法使用sqldf
感到恼火。
C_KEY VAR_C_2 VAR_C_3
2 BD 250
3 BE 251
5 BF 252
7 BG 253
KEY VAR_B_2 VAR_B_3 VAR_C_2 VAR_C_3
1
2 AB 134 BD 250
3 BE 251
4 AC 135
5 BF 252
6
7 AD 136 BG 253
merge(merge(A, B, by.x = "KEY", by.y = "B_KEY", all.x = TRUE), C,
by.x = "KEY", by.y = "C_KEY", all.x = TRUE)
names(B)[1] <- "KEY"
names(C)[1] <- "KEY"
Reduce(function(x, y) merge(x, y, all.x = TRUE), list(A, B, C))
# KEY VAR_B_2 VAR_B_3 VAR_C_2 VAR_C_3
#1 1 <NA> NA <NA> NA
#2 2 AB 134 BD 250
#3 3 <NA> NA BE 251
#4 4 AC 135 <NA> NA
#5 5 <NA> NA BF 252
#6 6 <NA> NA <NA> NA
#7 7 AD 136 BG 253