【问题标题】:data.table avoid recyclingdata.table 避免回收
【发布时间】:2018-08-27 00:52:30
【问题描述】:

我正在从两个(或更多)不同长度的输入向量构造data.table

x <- c(1,2,3,4)
y <- c(8,9)

dt <- data.table(x = x, y = y)

并且需要用NA 填充较短的向量,而不是回收它们的值,从而导致data.table 像这样:

   x  y
1: 1  8
2: 2  9
3: 3 NA
4: 4 NA

在将较短的向量传递给data.table() 构造函数之前,有没有办法在不使用NA 显式填充较短向量的情况下实现这一点?

谢谢!

【问题讨论】:

    标签: r data.table recycle


    【解决方案1】:

    可以使用超出范围索引:

    library("data.table")
    
    x <- c(1,2,3,4)
    y <- c(8,9)
    n <- max(length(x), length(y))
    
    dt <- data.table(x = x[1:n], y = y[1:n])
    # > dt
    #    x  y
    # 1: 1  8
    # 2: 2  9
    # 3: 3 NA
    # 4: 4 NA
    

    或者您可以通过这样做来扩展y(正如@Roland 在评论中推荐的那样):

    length(y) <- length(x) <- max(length(x), length(y))
    dt <- data.table(x, y)
    

    【讨论】:

    • 长度(y)
    【解决方案2】:

    一个选项是cbind.fill 来自rowr

    library(rowr)
    setNames(cbind.fill(x, y, fill = NA), c("x", "y"))
    

    或者将vectors 放在list 中,然后根据list 元素的最大长度在末尾填充NA

    library(data.table)
    lst <- list(x = x, y = y)
    as.data.table(lapply(lst, `length<-`, max(lengths(lst))))
    #   x  y
    #1: 1  8
    #2: 2  9
    #3: 3 NA
    #4: 4 NA
    

    【讨论】:

      【解决方案3】:

      jogo 提供的“超出范围索引”答案可以使用.N 干净地扩展到就地分配:

      x <- c(1,2,3,4)
      y <- c(8,9)
      n <- max(length(x), length(y))
      dt <- data.table(x = x[1:n], y = y[1:n])
      
      z <- c(6,7)
      dt[, z := z[1:.N]]
      #    x  y  z
      # 1: 1  8  6
      # 2: 2  9  7
      # 3: 3 NA NA
      # 4: 4 NA NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-01
        • 1970-01-01
        • 2022-01-18
        • 2020-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-30
        相关资源
        最近更新 更多