【问题标题】:data.table to long based on one column of vectors repeat another columndata.table 到 long 基于一列向量重复另一列
【发布时间】:2015-08-14 03:25:22
【问题描述】:

我有一个 data.table 有 2 列是向量列表。

   x     y        z
1: 1 1,2,3  8, 9,10
2: 2   5,6        3
3: 3 18,19      1,2

我想通过一个向量列表 (z`) 拉伸和取消列表,但保留并相应地重复作为向量列表的另一列。我saw how to almost do this 但收到如下错误:

library(data.table)

dat <- data.frame(
    x = 1:3,
    stringsAsFactors = FALSE
)

dat[['y']] <- list(1:3, 5:6, 18:19)
dat[['z']] <- list(8:10, 3, 1:2)

setDT(dat)

# inefficient way to get what I want 
a <- unlist(dat[['z']]) 
dat <- dat[rep(1:nrow(dat), sapply(z, length)), ]
dat[['z']] <- a

dat

   x     y  z
1: 1 1,2,3  8
2: 1 1,2,3  9
3: 1 1,2,3 10
4: 2   5,6  3
5: 3 18,19  1
6: 3 18,19  2

# trying to do this the data.table way
# Works but dropped column
dat[, .(z = as.integer(unlist(z))), by = .(x)]

# does not work (gives error)
dat[, .(z = as.integer(unlist(z))), by = .(x, y)]

Error in `[.data.table`(dat, , .(z = as.integer(unlist(z))), by = .(x,  : 
  column or expression 2 of 'by' or 'keyby' is type list. Do not quote column names. Usage: DT[,sum(colC),by=list(colA,month(colB))]

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    只需将y 列添加到您的j-expression

    dat[, .(y, z = as.integer(unlist(z))), by = x]
    #   x     y  z
    #1: 1 1,2,3  8
    #2: 1 1,2,3  9
    #3: 1 1,2,3 10
    #4: 2   5,6  3
    #5: 3 18,19  1
    #6: 3 18,19  2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 2022-07-07
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      相关资源
      最近更新 更多