如何从多个文本文件中获取特定的列和行值?

时间:2015-11-12 08:01:19

标签: r for-loop

我有文件夹"数据"有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]))

1 个答案:

答案 0 :(得分:5)

如果您想从一组文件中获取特定的行和列,我建议您使用data.table::fread()。使用select参数可以非常简单。有了它,您可以选择列,并结合skipnrow来抓取任意数量的行。请尝试以下操作,仅从每个文件中读取第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)将列表拖放到包含所有值的命名原子向量。

另一件需要考虑的事情是,如果文件中有行名,那么你也需要补偿这些行名。如果您使用selectskip参数,则不会花很长时间才能做到正确。

有关这些方法的完整示例,我们可以查看以下内容。在这里,我们从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