【问题标题】:How can I rbind multiple single-value rows to my data.frame?如何将多个单值行绑定到我的 data.frame?
【发布时间】:2021-10-04 06:02:21
【问题描述】:

以下按预期工作:

A <- data.frame(c(1, 2, 3))
B <- data.frame(4, 5, 6)
cbind(A, B)
  c.1..2..3. X4 X5 X6
1          1  4  5  6
2          2  4  5  6
3          3  4  5  6

现在我正在使用rbind 进行转置:

At <- data.frame(1, 2, 3)
Bt <- data.frame(c(4, 5, 6))
rbind(At, Bt)

这不起作用:

rbind(deparse.level, ...) 中的错误: 参数的列数不匹配

有趣的是,cbindrbind 都支持以下内容:

cbind(A, 4, 5, 6)
  c.1..2..3. 4 5 6
1          1 4 5 6
2          2 4 5 6
3          3 4 5 6

rbind(At, 4, 5, 6)
  X1 X2 X3
1  1  2  3
2  4  4  4
3  5  5  5
4  6  6  6

后者是我对rbind(At, Bt) 的期望。

我怎样才能得到它?

Edit2:一些上下文:我有一个大电话 rbind(A1t, ..., B1t, A2t, ..., B2t, A3t),所以我更喜欢一个处理 Bit 的答案,这样我就不必修改序列rbind 的参数。 (我可以用替代方法替换 rbind。)

编辑3: 虽然我认为cbindrbind 的实现是100% 相似的,但这仅适用于methods::cbindmethods::rbind

methods::cbind:https://github.com/wch/r-source/blob/79298c4/src/library/methods/R/cbind.R#L35-L125

methods::rbind:https://github.com/wch/r-source/blob/79298c4/src/library/methods/R/rbind.R#L24-L114

base::cbind:https://github.com/wch/r-source/blob/79298c4/src/main/bind.c#L1199

base::rbind:https://github.com/wch/r-source/blob/79298c4/src/main/bind.c#L1464

cbind.data.frame:https://github.com/wch/r-source/blob/79298c4/src/library/base/R/dataframe.R#L1259

rbind.data.frame:https://github.com/wch/r-source/blob/79298c4/src/library/base/R/dataframe.R#L1262

【问题讨论】:

    标签: r dataframe rbind cbind


    【解决方案1】:

    您可以使用do.call 来实现与rbind(At, 4, 5, 6) 相同的输出。

    At <- data.frame(col1 = 1, col2 = 2, col3 = 3)
    Bt <- data.frame(col1 = c(4, 5, 6))
    
    do.call(function(...) rbind(At, ...), as.list(Bt$col1))
    
    #  col1 col2 col3
    #1    1    2    3
    #2    4    4    4
    #3    5    5    5
    #4    6    6    6
    

    由于Bt$col1 的长度可以是可变的,我使用... 作为函数的参数。

    【讨论】:

    • 这很好。但是,我有一个大的rbind 调用,其中包含很多行,其中只有少数可以用作列表。类似于rbind(A1t, Bt, A2t)。有什么方法可以解压(这就是 do.call 所做的,对吧)只有 Bt 数据帧内联?
    • 你需要do.call(function(...) rbind(At, ..., A2t), as.list(Bt$col1)) 吗?
    • 好主意 - 我会试试的!不过,更紧凑的解决方案将是首选:)
    • 一旦你有了rbind(A1t, B1t, A2t, B2t, A3t),这就会变得非常难以阅读,除非我错过了一些非常明显的东西
    • 是的,正确的做法是在全局环境中不要有这么多的对象。如您所见,管理它们变得非常困难。您应该将它们保存在一个列表中。
    【解决方案2】:

    rbind(At, Bt)

    在这种情况下,您创建 2 个 data.frames:

    At <- data.frame(1, 2, 3)
    Bt <- data.frame(c(4, 5, 6))
    
    str(At)
    'data.frame':   1 obs. of  3 variables:
     $ X1: num 1
     $ X2: num 2
     $ X3: num 3
    
    str(Bt)
    'data.frame':   3 obs. of  1 variable:
     $ c.4..5..6.: num  4 5 6
    

    rbind 要求列名相同,列数也不同。

    rbind(At, 4, 5, 6)

    在这种情况下,R“完成”每一行,对整行重复每个数字,并给出一个自动名称,例如,X1。会和

    一样
    rbind(
      At,
      c(4,4,4),
      c(5,5,5),
      c(6,6,6)
      )
    

    rbind(
      At,
      data.frame(X1 = 4,X2 = 4,X3 = 4),
      data.frame(X1 = 5,X2 = 5,X3 = 5),
      data.frame(X1 = 6,X2 = 6,X3 = 6)
      )
    

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2011-02-02
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多