创建一个数据表,其中包含每个文件名列表的第 N 个数字

Create a datatable containing the Nth digit of each of a list of file names

我有一个包含大型模型输出的文件列表。 我使用以下方法将它们加载为数据表:

files <- list.files(path.expand("/XYZ/"), pattern = ".*\.rds", full.names =    TRUE)
dt<- as.data.table(files)

这个数据表 "dt" 只有 1 列,文件名。 例如 XZY_00_34234.rds

每个文件名的第50个和第51个字符是一个数字。 我想为每个文件创建一个包含该 2 位数字的数据表。

我用过:

index <- as.data.table(as.integer(substr(dt,50,51)))

这为我提供了第一个文件的正确值。 我想我应该可以对文件的每一行使用 apply to 运行 this

我试过了:

integers <- as.data.table(apply(dt,1,as.integer(substr(50,51))))

但是得到:

substr(50, 51) 错误:缺少参数 "stop",没有默认值

欢迎采纳任何建议!

尝试:

integers <- as.data.table(apply(dt, 1, function(x) as.integer(substr(x, 50, 51))))

apply 函数族接受其他函数并在向量和数组上执行它们。这些函数有时已经定义,但是 apply 函数中添加了一个有趣的特性,您可以在第一行直接编写函数。这样可以节省时间和击键次数。

更窄的编程设置要求您的函数首先像这样编写:

fiftieth_char <- function(x) {
  as.integer(substr(x, 50, 51))
}

接下来,可以将该函数传递给 apply 函数。

apply(dt, 1, fiftieth_char)

但看看我们是如何将这两个步骤合而为一的。

如果您只有 1 列,您可以将该列提取为 vector 并直接在其上使用 substr 而不是使用 apply 循环。对于 data.table,提取列是使用 ?Extract 函数 [[$

 as.data.table(as.integer(substr(dt[[1]], 50, 51)))

 as.data.table(as.integer(substr(dt$files, 50, 51)))

我注意到您正在从 'files' 创建 'dt' 作为 data.table。 list.files() 的输出是 vector,因此您可以 substr vector 并用 as.data.table 包装它,而不是先创建 data.table .

as.data.table(as.integer(files, 50, 51))

例如,

files <- c('ABC_25', 'DEF_39')
dt <- as.data.table(files)
as.integer(substr(dt[[1]], 5, 6))
#[1] 25 39
as.integer(substr(files, 5, 6))
#[1] 25 39