【问题标题】:Issues with selecting data.table columns via index通过索引选择 data.table 列的问题
【发布时间】:2019-11-25 18:00:17
【问题描述】:

我一直在尝试获取两个 data.table,对它们进行 cbind,然后重新对列进行排序,以便第一个 data.table 的第一列紧挨着第一个 data.table 的第一列,依此类推。

我使用 Map 函数来提出联锁索引,但是当我将值传递给 j 时,它只是将索引作为向量返回。以下是我所说的一些例子:

m <- data.table(a = 1:10, b = letters[1:10], c = LETTERS[1:10], d = rnorm(10))
m[, c(1, 3, 2, 4)] # works
m[, unlist(list(1, 3, 2, 4))] # doesn't work
m[, c(unlist(list(1, 3, 2, 4)))] # works
m[, c(unlist(Map(c, c(1, 2), c(3, 4))))] # doesn't work

【问题讨论】:

  • 使用setcolorder 函数,例如setcolorder(m, unlist(list(1, 3, 2, 4))),或使用with = FALSE,例如m[, unlist(list(1, 3, 2, 4)), with = FALSE]
  • 附注交错两个向量的更短方法是c(rbind(c(1, 2), c(3, 4)))
  • 试试with=FALSE

标签: r data.table


【解决方案1】:

data.table 的操作方式与 data.frame 略有不同。您可以使用 Map() 函数实现您想要的功能,如下所示:

m <- data.table(a = 1:10, b = letters[1:10], c = LETTERS[1:10], d = rnorm(10))
column_order = unlist(Map(c, c(1, 2), c(3, 4)))

setcolorder(m,column_order)

【讨论】:

    【解决方案2】:

    使用@Arun's answer,您可以交错任意数量的序列:

    d1 <- data.table(a = 1:10, b = letters[1:10])
    d2 <- data.table(c = LETTERS[1:10], d = rnorm(10))
    
    make_m <- function(...){
      ds = list(...)
      co = order(sequence(lengths(ds)))
    
      out = do.call(cbind, ds)
      setcolorder(out, co)[]
    }
    
    make_m(d1, d2)
    
         a c b            d
     1:  1 A a  0.260136119
     2:  2 B b  0.183627443
     3:  3 C c -0.597449642
     4:  4 D d -0.376898147
     5:  5 E e  0.857690453
     6:  6 F f  0.419492431
     7:  7 G g  1.491188939
     8:  8 H h -0.871813368
     9:  9 I i -0.086545214
    10: 10 J j  0.002349929
    

    代码略有不同,因为在编写 Arun 的答案时,lengths 不可用。

    【讨论】:

      猜你喜欢
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2014-06-19
      相关资源
      最近更新 更多