r - 列表上的 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])
解决方案
如果我们想子集 data.table 行,一个选项也是head
lapply(dt, head, 3)
或添加一个,
. 当我们不使用匿名函数时,最好命名参数,因为如果没有名称,它会根据参数的顺序进行评估。如果我们检查?Extract
x[i, j, ... , drop = TRUE]
drop = TRUE
OP 的 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]
我们可以有两个,
用于j
和by
或@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
推荐阅读
- scala - 无限可咖喱添加功能
- javascript - How to populate textInput spacer with hover menu interface
- javascript - 在悬停和灰色背景上显示图像
- javascript - 设置 eval 的范围
- python - 禁止输出以仅显示用法和文档字符串
- php - 将运行时常量值存储在函数区域设置静态变量中以加速多个调用是好还是坏的做法?
- oracle - MAximo 工单总人工成本和总材料成本
- javascript - 如何在 html 框中使用 CSS 添加多个文本?
- python - Julia 中的 one(c) 与 -one(c)
- java - Java 8 Streams how to avoid filtering with map or set?