我有一个包含大型模型输出的文件列表。 我使用以下方法将这些作为数据表加载:
n1
这个数据表" dt"只有1列,文件名。 例如XZY_00_34234.rds
每个文件名的第50个和第51个字符是一个数字。 我想为每个文件创建一个包含该2位数字的数据表。
我用过:
files <- list.files(path.expand("/XYZ/"), pattern = ".*\\.rds", full.names = TRUE)
dt<- as.data.table(files)
这为我提供了第一个文件的正确值。 我想我应该可以使用apply来对文件的每一行运行它
我试过了:
index <- as.data.table(as.integer(substr(dt,50,51)))
但是得到:
substr(50,51)中的错误:参数&#34;停止&#34;缺少,没有默认
感谢任何建议!
答案 0 :(得分:2)
尝试:
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 :(得分:1)
如果您只有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)))
我注意到你正在创造&#39; dt&#39;来自&#39;文件&#39;的data.table。 list.files()
的输出为vector
,因此您可以先substr
vector
而不是创建data.table,然后将其as.data.table
包裹起来。< / p>
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