【问题标题】:Joining two data frames of different lengths连接两个不同长度的数据帧
【发布时间】:2025-11-30 07:10:02
【问题描述】:

我有一个数据框,其中包含 25 周的销售数据。我计算了一个滞后移动平均线。现在,说x <- c(1,2,3,4) 和移动平均线y <- c(Nan,1,1.5,2,2.5)

如果我使用z <- data.frame(x,y),它会给我错误,因为尺寸不匹配。有没有办法通过在 x 列的末尾插入一个 NA 值来将它们作为数据框加入? '

当 x 是具有 n 行 m 列的数据框并且我想在其右侧附加一列长度为 (m+1) 时,是否可能发生相同的事情?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    另一种方法

     data.frame(x[1:length(y)], y)
    

    如果x是数据框,可以使用

    data.frame(x[1:length(y), ], y)
    

    【讨论】:

    • 不错。这对我来说是个新闻。
    • +1 用于压缩代码。但是,如果 x 是具有多列的matrix,则需要修改
    • 谢谢@akrun,我错过了OP的最后一点。
    【解决方案2】:

    你可以这样做

    > lst <- list(x = x, y = y)
    > m <- max(sapply(lst, length))
    > as.data.frame(lapply(lst, function(x){ length(x) <- m; x }))
    #     x   y
    # 1   1 NaN
    # 2   2 1.0
    # 3   3 1.5
    # 4   4 2.0
    # 5  NA 2.5
    

    针对您的评论,如果x 是矩阵,y 是向量,则取决于x 中的列数。但是对于这个例子

    cbind(append(x, rep(NA, length(y)-length(x))), y)
    

    如果x 有多个列,您可以使用多种

    apply(x, 2, append, NA)
    

    但同样,这取决于列中的内容以及 y 中的内容

    【讨论】:

    • 如果 x 是矩阵且 y 是向量(列)并且存在同样的问题,我该如何处理?
    【解决方案3】:

    也许这也有帮助:

    x<- 1:4
    x1 <- matrix(1:8,ncol=2)
    y <- c(NaN,1,1.5,2,2.5)
    
    
    do.call(`merge`, c(list(x,y),by=0,all=TRUE))[,-1]
    #    x   y
    #  1  1 NaN
    #  2  2 1.0
    #  3  3 1.5
    #  4  4 2.0
    #  5 NA 2.5
    
    do.call(`merge`, c(list(x1,y),by=0,all=TRUE))[,-1]
     # V1 V2   y
    #1  1  5 NaN
    #2  2  6 1.0
    #3  3  7 1.5
    #4  4  8 2.0
    #5 NA NA 2.5
    

    【讨论】: