我有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
和
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]))
如果要从文件集合中获取特定的行和列,建议您使用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行第2列,三次。
## 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句