【发布时间】:2019-07-29 20:05:06
【问题描述】:
我有许多具有相同结构(900*600 像素)的不同文本文件。现在我想从每个文本文件中提取 900*600 个向量,每个向量包含一个数据点。 例如,我想要一个来自位置 (x1,y1) 的向量,其中包含所有文本文件中的所有数据点。
在这里您可以看到我的代码,以便生成包含所有文本文件的列表。
file.list = list.files(pattern="*.txt", full.names=T)
df = data.frame( files= sapply(file.list, FUN = function(x)readChar(x, file.info(x)$size)), stringsAsFactors=FALSE)
现在“df”是一个包含所有文本文件的列表。 现在如何从所有文件中提取具有值的不同向量?
到目前为止,这是我的代码。我需要以某种方式定义一个函数(FUN)。
files = lapply(df, FUN, header = F, sep="\t", skip = 2, stringsAsFactors = F)
我准备了一个虚拟数据集。
a = matrix(c(15, 12, 37, 21, 37, 26, 33, 33, 27, 38, 32, 21, 24, 18,
20, 14, 32, 56, 16, 7, 23, 14, 34, 42), nrow = 3, ncol = 4)
b = matrix(c(14, 18, 34, 26, 37, 26, 32, 36, 21, 39, 32, 21, 22, 18,
20, 16, 42, 50, 16, 7, 23, 12, 36, 40), nrow = 3, ncol = 4)
c = matrix(c(10, 12, 34, 29, 31, 26, 30, 30, 20, 38, 36, 21, 29, 18,
20, 10, 32, 59, 16, 1, 23, 10, 39, 49), nrow = 3, ncol = 4)
file.list = list(a,b,c)
这里每个变量都对应一个文本文件(列在 file.list 中)。而不是 900*600 矩阵,而是 3*4 矩阵。
根据您的建议,我通过以下方式实现了这些功能。
cmbn = expand.grid(1:3, 1:4)
flen = length(file.list)
lapply(1:(nrow(cmbn)),function(t,lst,cmbn){
return(sapply(1:flen,function(i,t1,lst1,cmbn1){
return(lst1[[i]][cmbn1$Var1[t1],cmbn1$Var2[t1]])},t,lst,cmbn))}
,file.list,cmbn)
【问题讨论】:
-
也许您需要为列表中的每个文本文件 (
matrix(byrow = TRUE, ncol = 900, nrow = 600)) 创建一个矩阵,然后使用strsplit(sep = "")之类的东西遍历列表的每个文本文件,这将返回一个列表带有所有字符的向量。然后你需要将其子集strsplit(sep = "")[[1]]并将其分配给先前创建的矩阵matrix[] <- strsplit(sep = "")[[1]] -
我通过首先创建新矩阵来理解该方法。但我不明白如何在列表的每个文本文件上迭代它。你知道我可以在“lapply”行中包含的函数的外观吗?
-
能否用示例数据更新您的问题?拥有类似于“df”的数据会很有用,包含所有文本文件的列表,所以我可以试一试
-
当然可以。没问题
-
@stefx 您想从每个文件中提取哪些索引?
标签: r list vector text extraction