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

4

我有一组文件,包含了一个大型模型的输出结果。我使用以下代码将其加载为datatable:

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

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

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

我使用了以下代码:

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

这使我得到了第一个文件的正确值。 我认为我可以使用apply将其对每个文件的行进行运行。

我尝试过:

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)))) - Pierre L
2个回答

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
如果您只有一个列,可以将该列作为向量提取,并直接在其上使用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’。‘list.files()’的输出是一个‘vector’,因此你可以先对‘vector’使用‘substr’函数,然后使用‘as.data.table’将其包装。请保留html标记。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接