【问题标题】:Merge 2 dataframes with multiple columns of different column names合并具有不同列名的多列的 2 个数据框
【发布时间】:2015-05-13 07:00:59
【问题描述】:

我需要帮助解决我无法解决的合并(vlookup)问题。 我有 2 个要合并的数据框,此外它们还有不同的列名。我的真实数据集有很多列,这就是为什么我很难想出一个解决方案。 我已经尝试过合并功能,但我无法弄清楚如何在具有不同名称的多个列上执行此操作。我想明确指定 列名使用类似:

output <- merge(df1, df.vlookup, by.x=????, by.y=???, ) #just where I am today

这是一个非常简单的例子

id<-c(2,4,6,8,10,12,14,16,18,20,22,24,26,28)
bike <- c(1,3,2,1,1,1,2,3,2,3,1,1,1,1)
size <- c(1,2,1,2,1,2,1,2,1,2,1,2,1,2)
color <-c (10,11,13,15,12,12,12,11,11,14,12,11,10,10)
price <- c(1,2,2,2,1,3,1,1,2,1,2,1,2,1)


df1 <- data.frame(id,bike,size,color,price)

   id bike size color price
1   2    1    1    10     1
2   4    3    2    11     2
3   6    2    1    13     2
4   8    1    2    15     2
5  10    1    1    12     1
6  12    1    2    12     3
7  14    2    1    12     1
8  16    3    2    11     1
9  18    2    1    11     2
10 20    3    2    14     1
11 22    1    1    12     2
12 24    1    2    11     1
13 26    1    1    10     2
14 28    1    2    10     1


b1<-c(1,2,3)
b2<-c("Alan", "CCM", "Basso")
s1 <- c(1,2)
s2 <- c("L","S")
c1<-c(10,11,12,13,14,15)
c2 <-c("black","blue","green","red","pink")
p1<- c(1,2,3)
p2<- c(1000,2000,3000)

#trick for making a dataframe with unequal vector length
na.pad <- function(x,len){
  x[1:len]
}

makePaddedDataFrame <- function(l,...){
  maxlen <- max(sapply(l,length))
  data.frame(lapply(l,na.pad,len=maxlen),...)
}

df.vlookup <- makePaddedDataFrame(list(b1=b1,b2=b2,s1=s1,s2=s2,c1=c1,c2=c2,p1=p1,p2=p2))

> df.vlookup
  b1    b2 s1   s2 c1    c2 p1   p2
1  1  Alan  1    L 10 black  1 1000
2  2   CCM  2    S 11  blue  2 2000
3  3 Basso NA <NA> 12 green  3 3000
4 NA  <NA> NA <NA> 13   red NA   NA
5 NA  <NA> NA <NA> 14  pink NA   NA
6 NA  <NA> NA <NA> 15  <NA> NA   NA

这是我想最终得到的数据框:

> df.final
   id bike    b2 size s2 color    c2 price
1   2    1  Alan    1  L    10 black     1
2   4    3 Basso    2  S    11  blue     2
3   6    2   CCM    1  L    13   red     2
4   8    1  Alan    2  S    15  #N/A     2
5  10    1  Alan    1  L    12 green     1
6  12    1  Alan    2  S    12 green     3
7  14    2   CCM    1  L    12 green     1
8  16    3 Basso    2  S    11  blue     1
9  18    2   CCM    1  L    11  blue     2
10 20    3 Basso    2  S    14  pink     1
11 22    1  Alan    1  L    12 green     2
12 24    1  Alan    2  S    11  blue     1
13 26    1  Alan    1  L    10 black     2
14 28    1  Alan    2  S    10 black     1   

非常感谢您对此的帮助...

【问题讨论】:

    标签: r merge dataframe


    【解决方案1】:

    我认为查找值的单个数据框不是正确的方法。使用命名向量怎么样?

    例如:

    bike_names <- c("Alan" = 1, "CCM" = 2, "Basso" = 3)
    df1$b2 <- names(bike_names[ df1$bike ])
    

    如果使用数据框,请将每个查找表放在单独的数据框中。

    lookup <- list(
      bike = data.frame( bike = c(1, 2, 3), bike_name = c("Alan", "CCM", "Basso")),
      size = data.frame(size = c(1, 2),  size_name = c("L", "S")),
      color = data.frame(color = c(10, 11, 12, 13, 14, 15), color_name = c("black", "blue", "green", "red", "pink", NA)),
      price = data.frame(price = c(1, 2, 3), price_name = c(1000, 2000, 3000))
    )
    

    并将其与合并一起使用:

    Reduce(merge, c(data = list(df1), lookup))
    

    或者使用 dplyr 并加入:

    library(dplyr)
    
    df1 %>%
      left_join(lookup$bike, by = c("bike")) %>%
      left_join(lookup$size, by = c("size")) %>%
      left_join(lookup$color, by = c("color")) %>%
      left_join(lookup$price, by = c("price"))
    

    更新

    但如果你真的想从df.vlookup数据框开始,你可以将它转换成这样的数据框列表:

    lookup <- lapply(seq(1, to = ncol(df.vlookup), by = 2), function(i) {
      setNames(df.vlookup[,c(i,i+1)], c(names(df1)[i/2+2], names(df.vlookup)[i+1]))
    })
    

    并在多重合并中使用它:

    Reduce(merge, c(data = list(df1), lookup))
    

    注意:在创建查找列表时,df1df.vlookup 中的列顺序有一些假设

    【讨论】:

    • 谢谢您,此数据工作正常。但是,我的原始数据有很多列,生成单个查找表需要大量手动输入
    • @jonas 我认为在lookup list 的定义中,键入的内容比从具有特殊“技巧”的向量创建向量和不规则 data.frame 少。但是好的,请参阅使用您的df.lookup 的答案更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2018-03-21
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多