将列表分配给data.table

时间:2019-01-16 13:34:07

标签: r data.table

在下面的代码中,我创建一个data.table并输入一些内容:

library(data.table)
int.tables <- c( "Sheet_A","TBL 002"
                 ,"Sheet_B", "TBL 001"
                 ,"Sheet_B", "TBL 004"
                 ,"Sheet_C", "TBL 009")

int.tables<-data.table(matrix(int.tables,ncol = 2,byrow = T)) 
setnames(int.tables,c("sheet","table"))

level_Sheet_A <- list(   "Level_1",   "Level_2",   "Level_3" )

int.tables[sheet == "Sheet_B" & table %in% c("TBL 001", "TBL 004")
           , legend_levels := .(.(level_Sheet_A))]

但是,为了正确地在每行中将列表作为整个元素正确输入,在最后一行中需要使用奇怪的代码.(.())。否则,输出将沿行枚举level_sheet_A的元素。 有更好/更清洁的方法吗?

1 个答案:

答案 0 :(得分:1)

我会这样写:

int.tables <- data.frame(sheet = c( "Sheet_A", "Sheet_B", "Sheet_B","Sheet_C"),
                         table = c("TBL 002","TBL 001", "TBL 004", "TBL 009"))

index  <- int.tables$sheet == c("Sheet_B") & 
          int.tables$table %in% c("TBL 001", "TBL 004")

int.tables$legend_levels[index] <- list(c("Level_1", "Level_2", "Level_3" ))

然后,您删除对data.table的依赖,并避免不必要的矩阵构造。如果您想添加类data.table来获得漂亮的打印效果

class(int.tables) <- c("data.table", class(int.tables))