我有36个文本文件的文件夹"数据".每个文件都有3000多列和行.我希望将特定的列和行值作为向量
示例,第10列和第10行.我想循环以获取文件夹"Data"中36个文本文件的列和行的值.我是R.的新手
它是我在matlab中的代码
function data = readImage
data = [];
listImage = ls('*.hdf');
for i = 1:size(listImage,1)
name = strtrim(listImage(i,:));
citra = hdfread(name,'PIXEL DATA');
result = point(citra);
data = [data; result];
end
end
Run Code Online (Sandbox Code Playgroud)
和
function p = point(image)
p = [];
for i = 3941 %column number
for j = 1595 %row number
image = citra(i,j);
p = [image];
end
end
end
Run Code Online (Sandbox Code Playgroud)
我已成功导入文件
setwd("D:/data")
temp = list.files(pattern="*.txt")
for (i in 1:length(temp)) assign(temp[i], read.table(temp[i]))
Run Code Online (Sandbox Code Playgroud)
如果您想从文件集中获取特定的行和列,我建议您使用data.table::fread().这个select论点很简单.有了它,您可以选择列,加上skip并nrow抓取任意数量的行.请尝试以下操作,仅从每个文件中读取第10行第10列 -
library(data.table)
datalist <- lapply(temp, fread, select = 10, skip = 9, nrow = 1)
Run Code Online (Sandbox Code Playgroud)
如果每个文件中都有标题行,则可以更改为skip = 109而不是添加header = TRUE.然后你可以用每个元素命名
names(datalist) <- paste0("temp", seq_along(datalist))
Run Code Online (Sandbox Code Playgroud)
现在您已经有了一个带有命名元素的列表,可以通过$运算符按名称访问它们.这通常比将它们全部分配给全局环境更好.
列表元素datalist将是数据表.如果您需要单个原子向量元素,那么以下可能更好 -
datalist <- lapply(temp, function(x) fread(x, select=10, skip=9, nrow=1)[[1L]])
Run Code Online (Sandbox Code Playgroud)
有了这个,您可以使用unlist(datalist)将列表拖放到具有所有值的命名原子向量,如果您不希望它们在列表中.
另一件需要考虑的事情是,如果你在文件中有行名,你也需要补偿它们.如果你玩弄select和skip争论它不会花很长时间才能正确.
有关这些方法的完整示例,我们可以查看以下内容.在这里,我们从iris数据集中抓取第3行第3列,三次.
## write iris to a csv file
write.csv(iris, file = "iris.csv", quote = FALSE, row.names = FALSE)
temp <- rep("iris.csv", 3)
datalist <- lapply(temp, function(x) fread(x, select=2, skip=3, nrow=1)[[1L]])
names(datalist) <- paste0("temp", seq_along(datalist))
## results
datalist
# $temp1
# [1] 3.2
#
# $temp2
# [1] 3.2
#
# $temp3
# [1] 3.2
unlist(datalist)
# temp1 temp2 temp3
# 3.2 3.2 3.2
## compare to
iris[3, 2]
[1] 3.2
Run Code Online (Sandbox Code Playgroud)