【问题标题】:Appending the row to data.table works differently than in data.frame: How and why?将行附加到 data.table 与在 data.frame 中的工作方式不同:如何以及为什么?
【发布时间】:2023-04-11 07:22:01
【问题描述】:

为什么下面的代码不起作用?

library(data.table)
team_table <- as.data.table(matrix(NA,ncol = 11))
rbind(team_table,1:11)

而与 data.frame 相同的版本呢?

team_table <-as.data.frame(matrix(NA,ncol = 11))
rbind(team_table,1:11)

【问题讨论】:

    标签: r dataframe data.table rbind


    【解决方案1】:

    转换为list,它应该可以工作

    rbind(team_table,as.list(1:11))
    #   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
    #1: NA NA NA NA NA NA NA NA NA  NA  NA
    #2:  1  2  3  4  5  6  7  8  9  10  11
    

    data.frame也是同样的行为

    rbind(team_table,as.list(1:11))
    #  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
    #1 NA NA NA NA NA NA NA NA NA  NA  NA
    #2  1  2  3  4  5  6  7  8  9  10  11
    

    关于它失败的原因,data.table 中的rbind 正在调用rbindlist,它正在将向量 (1:11) 视为单个列。

    rbind(team_table,1:11)
    

    rbindlist(l, use.names, fill, idcol) 中的错误:第 2 项有 1 列,与具有 11 列的项目 1 不一致。填写 缺少的列使用 fill=TRUE。

    如果我们将其转换为具有 11 个元素的 listdata.framedata.table 是具有列表元素的 list,即具有相同长度的列),它会起作用,因为它会将列数视为一样的

    【讨论】:

      【解决方案2】:

      由于1:11 被视为一列,我们可以将值转置为rbind 它作为一行

      library(data.table)
      team_table <- as.data.table(matrix(NA,ncol = 11))
      rbind(team_table,t(1:11))
      
      #   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
      #1: NA NA NA NA NA NA NA NA NA  NA  NA
      #2:  1  2  3  4  5  6  7  8  9  10  11
      

      【讨论】:

      • 谢谢!我确实尝试过做类似的事情,但我只知道 transpose() 函数......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 2017-10-24
      相关资源
      最近更新 更多