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

时间:2015-06-09 01:37:39

标签: r data.table apply

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

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;缺少,没有默认

感谢任何建议!

2 个答案:

答案 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