【问题标题】:from n text files to list of n objects in r从 n 个文本文件到 r 中 n 个对象的列表
【发布时间】:2021-01-27 18:12:23
【问题描述】:

我有一个包含多个文本文件的文件夹“prod”:

prod_123456.txt
prod_123474.txt
prod_1234567543.txt etc...

在每个对象中都有一个对象列表(不带逗号),如下所示:

prod_123456.txt 包含

1213423
1245
12345
2321
134135

prod_123474.txt 包含:

23425364
3245
123425367485

等等

我想读取文件夹 prod 中的所有文件,以便它们存储在列表对象的列表中,如下所示:

[[1]]  123456
             
[1] 1213423
[2] 1245
[3] 12345
[4] 2321 
[5] 134135

[[2]]  123474
             
[1] 23425364
[2] 3245
[3] 123425367485

等等

所以基本上,n个元素的列表对应于n个txt文件,其中txt文件名中的代码是元素本身,并且对于每个元素都有一个txt文件中包含的对象的列表

这就是我目前所拥有的

filenames <- list.files("folder/", pattern="prod", full.names=TRUE)
ldf <- lapply(filenames, function(i){
  read.csv(i, header=FALSE)
})

但它是一个数据框列表,并且列表的元素中没有相应文件的名称

【问题讨论】:

  • 你尝试过什么,什么没用?

标签: r list csv txt


【解决方案1】:

您可以创建一个矢量文件名并使用readLines 读取它。

filenames <- list.files('path/of/folder', full.names = TRUE, pattern = '\\.txt$')
list_of_vector <- sapply(filenames, readLines, simplify = FALSE)

如果您希望每个元素本身都是一个列表,我们可以在函数中as.list

list_of_list <- sapply(filenames, function(x) 
                       as.list(readLines(x)), simplify = FALSE)

使用sapplysimplify = FALSE 允许我们创建一个命名列表。

如果我们希望名称只是文件名中的数字而不是我们可以使用的完整路径:

names(list_of_vector) <- sub('.*prod_(.*)\\.txt', '\\1', filenames)

【讨论】:

  • 它有效,唯一的问题是元素的名称是文件“path/of/folder/prod_1234”而不是“1234”的整个目录
  • 我们可以使用正则表达式选择路径的相关部分。查看更新的答案。
猜你喜欢
  • 1970-01-01
  • 2011-09-18
  • 2017-01-25
  • 2016-04-08
  • 2020-08-07
  • 2021-06-23
  • 2020-03-31
  • 2021-05-08
  • 2018-05-27
相关资源
最近更新 更多