首页 > 解决方案 > 列表上的 R data.table 运算符

问题描述

在 data.tables 列表上应用 data.table 运算符的正确方法是什么?例如,在基础 R 中,我们可以将 data.frames 列表中的每个 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])

标签: rlistdata.tableoperators

解决方案


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

lapply(dt, head, 3)

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

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

drop = TRUEOP 的 data.frame 索引子集中的 TRUE 值似乎就是这种情况。但是,data.table在 之前有很多论点drop

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

推荐阅读