【问题标题】:Combine two dataframes into one by intercalating the columns of each one of the two original dataframes通过插入两个原始数据帧中每一个的列将两个数据帧合并为一个
【发布时间】:2021-06-22 06:52:09
【问题描述】:

所以我有两个数据框,df1 和 df2,它们都有相同的列数(并且具有相同的名称)但行数不同。我想将它们组合成一个大数据框,其中第一列是 df1 的第一列,第二列是 df2 的第一列,第三列是 df1 的第二列,第四列是 df2 的第二列,等等。

【问题讨论】:

  • 您能否添加一个可重现的示例?这意味着拥有代码和数据的简化版本,以便人们可以尝试运行它。想了解更多细节可以参考这个link

标签: r


【解决方案1】:

使用内置的BOD 数据框构造样本df1 和df2 输入。

然后遍历列将每个列的第 j 列转换为 ts 系列(因为 ts 系列即使具有不同的行数也可以被 cbind'ed),然后 cbind 并将其转换为数据框。最后给它起个好听的名字。不使用任何包。

# test data
df1 <- BOD  # 6x2 data frame w Time and demand col names
df2 <- head(10 * BOD, 3) # 3x2 data frame w same names

nc <- ncol(df1)
out <- do.call("data.frame", lapply(1:nc, function(j) cbind(ts(df1[,j]), ts(df2[,j]))))
names(out) <- make.names(rep(names(df1), each = 2), unique = TRUE)

out

给予:

  Time Time.1 demand demand.1
1    1     10    8.3       83
2    2     20   10.3      103
3    3     30   19.0      190
4    4     NA   16.0       NA
5    5     NA   15.6       NA
6    7     NA   19.8       NA

【讨论】:

    【解决方案2】:

    使用iris 数据集的base 解决方案。

    首先,重命名列以使列按顺序命名。其次,有两个数据框,df1 和df2,在它们中创建一个虚拟变量作为键。 第三,left-join df1 和 df2 基于 dummy(merge 和 all.x = TRUE 参数)。第四,删除 dummy,第五,重新排列你的列。

    df <- iris
    names(df) <- paste0("column",c("A", "B", "C", "D", "E"))
    head(df)
    df1 <- df[1:10,] #first data frame
    df2 <- df[11:16,] #second data frame different number of rows
    df1$dummy <- 1:nrow(df1) #Creating a dummy variable for merging
    df2$dummy <- 1:nrow(df2) #Creating a dummy variable for merging
    
    result <- base::merge(df1, df2, by  = "dummy", all.x = TRUE) #merging per dummy
    result$dummy<- NULL # I don't need dummy anymore
    
    result[,sort(names(result))] #Your result
    
    #Output
       columnA.x columnA.y columnB.x columnB.y columnC.x columnC.y columnD.x columnD.y columnE.x columnE.y
    1        5.1       5.4       3.5       3.7       1.4       1.5       0.2       0.2    setosa    setosa
    2        4.9       4.8       3.0       3.4       1.4       1.6       0.2       0.2    setosa    setosa
    3        4.7       4.8       3.2       3.0       1.3       1.4       0.2       0.1    setosa    setosa
    4        4.6       4.3       3.1       3.0       1.5       1.1       0.2       0.1    setosa    setosa
    5        5.0       5.8       3.6       4.0       1.4       1.2       0.2       0.2    setosa    setosa
    6        5.4       5.7       3.9       4.4       1.7       1.5       0.4       0.4    setosa    setosa
    7        4.6        NA       3.4        NA       1.4        NA       0.3        NA    setosa      <NA>
    8        5.0        NA       3.4        NA       1.5        NA       0.2        NA    setosa      <NA>
    9        4.4        NA       2.9        NA       1.4        NA       0.2        NA    setosa      <NA>
    10       4.9        NA       3.1        NA       1.5        NA       0.1        NA    setosa      <NA>
    

    【讨论】:

      【解决方案3】:
      # load packages
      library(tidyverse)
      
      # define function to allow cbinding DFs of different length
      # taken from: https://stackoverflow.com/a/7962286
      cbind.fill <- function(...){
        nm <- list(...) 
        nm <- lapply(nm, as.matrix)
        n <- max(sapply(nm, nrow)) 
        do.call(cbind, lapply(nm, function (x) 
          rbind(x, matrix(, n-nrow(x), ncol(x))))) 
      }
      
      # make some sample DFs
      df1 <- data.frame(a = 1:3, b = 4:6)
      df2 <- data.frame(a = 1:5, b = 6:10)
      
      # merge them and reorder collate col positions
      cbind.fill(df1, df2) %>% 
        as_tibble(.name_repair = "unique") %>%
        select(c(seq(1, ncol(.), 2), seq(2, ncol(.), 2)))
      #> New names:
      #> * a -> a...1
      #> * b -> b...2
      #> * a -> a...3
      #> * b -> b...4
      #> # A tibble: 5 x 4
      #>   a...1 a...3 b...2 b...4
      #>   <int> <int> <int> <int>
      #> 1     1     1     4     6
      #> 2     2     2     5     7
      #> 3     3     3     6     8
      #> 4    NA     4    NA     9
      #> 5    NA     5    NA    10
      

      由reprex package (v1.0.0) 于 2021-03-25 创建

      【讨论】:

        猜你喜欢
        • 2021-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-18
        相关资源
        最近更新 更多