创建一个数据表,其中包含每个文件名列表的第 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
我有一个包含大型模型输出的文件列表。 我使用以下方法将它们加载为数据表:
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