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.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
在 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.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