我在R中有两个数据帧。
数据帧1
A B C D E F G
1 2 a a a a a
2 3 b b b c c
4 1 e e f f e数据帧2
X Y Z
1 2 g
2 1 h
3 4 i
1 4 j我想将dataframe1的列A和B与dataframe2的列X和Y匹配。这不是成对比较,即第1行(A=1 B=2)被认为与dataframe2的第1行(X=1,Y=2)和第2行(X=2,Y=1)相同。
当可以找到匹配时,我想将dataframe1的列C、D、E、F添加回dataframe2的匹配行,如下所示:没有匹配作为na。
最终数据帧
X Y Z C D E F G
1 2 g a a a a a
2 1 h a a a a a
3 4 i na na na na na
1 4 j e e f f e我只能知道如何对单列进行匹配,但是如何对两个可交换的列进行匹配,并根据匹配结果合并两个数据帧对我来说是困难的。请帮助提供聪明的方式来做这件事。
为了便于讨论(感谢Vincent和DWin的评论(我之前的问题),我应该测试一下这句话。)这里有将数据帧1和2加载到R的配额。
df1 <- data.frame(A = c(1,2,4), B=c(2,3,1), C=c('a','b','e'),
D=c('a','b','e'), E=c('a','b','f'),
F=c('a','c','f'), G=c('a','c', 'e'))
df2 <- data.frame(X = c(1,2,3,1), Y=c(2,1,4,4), Z=letters[7:10])发布于 2011-05-25 15:10:05
下面的工作是有效的,但毫无疑问可以改进。
我首先创建一个小帮助器函数,它对A和B执行按行排序(并将其重命名为V1和V2)。
replace_index <- function(dat){
x <- as.data.frame(t(sapply(seq_len(nrow(dat)),
function(i)sort(unlist(dat[i, 1:2])))))
names(x) <- paste("V", seq_len(ncol(x)), sep="")
data.frame(x, dat[, -(1:2), drop=FALSE])
}
replace_index(df1)
V1 V2 C D E F G
1 1 2 a a a a a
2 2 3 b b b c c
3 1 4 e e f f e这意味着您可以使用简单的merge来组合数据。
merge(replace_index(df1), replace_index(df2), all.y=TRUE)
V1 V2 C D E F G Z
1 1 2 a a a a a g
2 1 2 a a a a a h
3 1 4 e e f f e j
4 3 4 <NA> <NA> <NA> <NA> <NA> i发布于 2011-05-25 15:28:09
这有点笨拙,可能存在一些冲突和顺序问题,但适用于您的示例
df1a <- df1; df1a$A <- df1$B; df1a$B <- df1$A #reverse A and B
merge(df2, rbind(df1,df1a), by.x=c("X","Y"), by.y=c("A","B"), all.x=TRUE)生产
X Y Z C D E F G
1 1 2 g a a a a a
2 1 4 j e e f f e
3 2 1 h a a a a a
4 3 4 i <NA> <NA> <NA> <NA> <NA>发布于 2011-05-26 00:14:07
一种方法是创建一个顺序不变的用于匹配的id键。
# create id key to match
require(plyr)
df1 = adply(df1, 1, transform, id = paste(min(A, B), "-", max(A, B)))
df2 = adply(df2, 1, transform, id = paste(min(X, Y), "-", max(X, Y)))
# combine data frames using `match`
cbind(df2, df1[match(df2$id, df1$id),3:7])这将产生输出
X Y Z id C D E F G
1 1 2 g 1 - 2 a a a a a
1.1 2 1 h 1 - 2 a a a a a
NA 3 4 i 3 - 4 <NA> <NA> <NA> <NA> <NA>
3 1 4 j 1 - 4 e e f f ehttps://stackoverflow.com/questions/6119955
复制相似问题