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

1 for-loop r

我有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)

Ric*_*ven 5

如果您想从文件集中获取特定的行和列,我建议您使用data.table::fread().这个select论点很简单.有了它,您可以选择列,加上skipnrow抓取任意数量的行.请尝试以下操作,仅从每个文件中读取第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)将列表拖放到具有所有值的命名原子向量,如果您不希望它们在列表中.

另一件需要考虑的事情是,如果你在文件中有行名,你也需要补偿它们.如果你玩弄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
Run Code Online (Sandbox Code Playgroud)