R data.table 列表上的运算符

R data.table operators on lists

在 data.table 列表上应用 data.table 运算符的正确方法是什么?例如,在 base R 中,我们可以将 data.frame 列表中的每个 data.frame 子集化为:lapply(df, "[", 1:3, TRUE)。 data.tables 的正确方法是什么?

df <- data.frame(expand.grid(year = seq(1975, 1980), name = c("Frank", "Tony", "Edward")))

df <- lapply(1975:1979, function(t) df[with(df, t <= year & year <= t + 1), TRUE])

lapply(df, `[`, 1:3, TRUE)

library(data.table)

dt <- lapply(df, setDT)

lapply(dt, function(x) x[1:3])

如果我们想对 data.table 行进行子集化,一个选项也是 head

lapply(dt, head, 3)

或加一个,。当我们不使用匿名函数时,最好给参数命名,因为如果没有名称,它会根据参数的顺序进行评估。如果我们检查 ?Extract

x[i, j, ... , drop = TRUE]

drop = TRUE OP 的 data.frame 索引子集中的 TRUE 值似乎就是这种情况。但是,对于 data.tabledrop

之前有很多参数
x[i, j, by, keyby, with = TRUE,
  nomatch = getOption("datatable.nomatch", NA),
  mult = "all",
  roll = FALSE,
  rollends = if (roll=="nearest") c(TRUE,TRUE)
             else if (roll>=0) c(FALSE,TRUE)
             else c(TRUE,FALSE),
  which = FALSE,
  .SDcols,
  verbose = getOption("datatable.verbose"),                   # default: FALSE
  allow.cartesian = getOption("datatable.allow.cartesian"),   # default: FALSE
  drop = NULL, on = NULL]

我们可以为 jby 设置两个 , 或者正如评论中提到的@Onyambu,我们可以简单地使用索引,因为行索引是第一个参数

lapply(dt, "[", 1:3, ,)
#[[1]]
#   year  name
#1: 1975 Frank
#2: 1976 Frank
#3: 1975  Tony

#[[2]]
#   year  name
#1: 1976 Frank
#2: 1977 Frank
#3: 1976  Tony

#[[3]]
#   year  name
#1: 1977 Frank
#2: 1978 Frank
#3: 1977  Tony

#[[4]]
#   year  name
#1: 1978 Frank
#2: 1979 Frank
#3: 1978  Tony

#[[5]]
#   year  name
#1: 1979 Frank
#2: 1980 Frank
#3: 1979  Tony