首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于匹配每个数据帧中的两个可交换列来合并两个数据帧

基于匹配每个数据帧中的两个可交换列来合并两个数据帧
EN

Stack Overflow用户
提问于 2011-05-25 13:34:32
回答 5查看 3.7K关注 0票数 6

我在R中有两个数据帧。

数据帧1

代码语言:javascript
复制
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

代码语言:javascript
复制
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。

最终数据帧

代码语言:javascript
复制
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的配额。

代码语言:javascript
复制
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])
EN

回答 5

Stack Overflow用户

发布于 2011-05-25 15:10:05

下面的工作是有效的,但毫无疑问可以改进。

我首先创建一个小帮助器函数,它对A和B执行按行排序(并将其重命名为V1和V2)。

代码语言:javascript
复制
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来组合数据。

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2011-05-25 15:28:09

这有点笨拙,可能存在一些冲突和顺序问题,但适用于您的示例

代码语言:javascript
复制
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)

生产

代码语言:javascript
复制
  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>
票数 2
EN

Stack Overflow用户

发布于 2011-05-26 00:14:07

一种方法是创建一个顺序不变的用于匹配的id键。

代码语言:javascript
复制
# 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])

这将产生输出

代码语言:javascript
复制
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    e
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6119955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档