我有文件夹"数据"有36个文本文件。每个文件都有3000多列和行。我希望将特定的列和行值作为向量
示例,第10列和第10行。我想循环获取文件夹中的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
和
function p = point(image)
p = [];
for i = 3941 %column number
for j = 1595 %row number
image = citra(i,j);
p = [image];
end
end
end
我已成功导入文件
setwd("D:/data")
temp = list.files(pattern="*.txt")
for (i in 1:length(temp)) assign(temp[i], read.table(temp[i]))
答案 0 :(得分:5)
如果您想从一组文件中获取特定的行和列,我建议您使用data.table::fread()
。使用select
参数可以非常简单。有了它,您可以选择列,并结合skip
和nrow
来抓取任意数量的行。请尝试以下操作,仅从每个文件中读取第10行第10行 -
library(data.table)
datalist <- lapply(temp, fread, select = 10, skip = 9, nrow = 1)
如果每个文件中都有标题行,则可以更改为skip = 10
而不是9或添加header = TRUE
。然后,您可以使用
names(datalist) <- paste0("temp", seq_along(datalist))
现在您已经获得了一个包含命名元素的列表,可以使用$
运算符按名称访问这些元素。这通常比将它们全部分配给全局环境更好。
datalist
中的列表元素将是数据表。如果您需要单个原子向量元素,那么以下可能更好 -
datalist <- lapply(temp, function(x) fread(x, select=10, skip=9, nrow=1)[[1L]])
如果您不希望它们列在列表中,您可以使用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