读取文件名而不是文件内的数据

时间:2013-11-23 21:15:26

标签: r matrix

大家好,你好。 我是R和matlab的新手,一直在网上搜索,但无法找到任何东西。问题是当我创建一个最终矩阵时,它只列出文件名。

背后的背景,让你理解我的意思:

我正在使用内置matlab的R并尝试从15个.txt文件中读取数据。这15个文件都有2列数据和1686行。我应该使用dir()函数将这些文件放入类型列表的向量中。然后我访问该向量的每个元素并将其传递给read.table()函数,以便我可以创建一个包含数据的矩阵N.如前所述,这些文件有2列,我被告知要提取每个文件的第1列并将其放在名为X的矩阵的第i列中.X有16行代表15个文件,标题行和1687列对于数据和解雇第一列。

当我在R studio的控制台位中键入X时,它会在X [i,]< - t(N [,1])中出现错误:要替换的项目数不是替换长度的倍数

我认为很公平,我会将X改为15乘15矩阵,然后它会得到一个包含.txt文件名的矩阵,而不是我想要的数据。 在尝试解决多个替换长度错误之前,我首先要解决文件名的这个错误。 我的代码中有什么问题吗?我已经编写了下面的代码,好像用15 x 15矩阵来演示文件名问题,而不是16 x 1687原文:

# Clear workspace
rm(list=ls())
# Close any open graphics devices
graphics.off()
# Load additional packages
require(matlab, quietly=TRUE)
# Activate functions
source("auto.r")
source("mncn.r")
source("rangescale.r")
source("hcluster2.r")


filelist <- dir(path = "~/MSc/Course/Module3", pattern = "*.txt", all.files = FALSE,
    full.names = FALSE, recursive = FALSE,
    ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE)

for (i in 1:length(filelist)) assign(filelist[i], read.table(filelist[i], sep="\t", header=T, row.names=1))

filelist <- as.matrix(filelist)
N <- filelist
X <- matrix (nrow = 15, ncol = 15)
X[i,] <- t(N[,1])

2 个答案:

答案 0 :(得分:1)

试用应用函数,applysapplymapply等。

由于您正在处理文件列表,因此您需要的是lapply

类似于

的东西

datalist <- lapply(filelist, function(x) read.table(x, header = T))

举个例子:让我制作一些文本文件

dat1 <- data.frame(x = rnorm(10),
                   y = rnorm(10))
dat2 <- data.frame(x = rnorm(5),
                   y = rnorm(5),
                   z = rnorm(5))

tmp <- c('dat1','dat2')
lapply(tmp, function(x) write.table(get(x), file = paste0(x,'.txt'), quote = F, row.names = F))

现在,这就是我在你的情况下会做的事情。

filelist <- dir(path = '.', pattern = "*.txt", all.files = FALSE,
                full.names = FALSE, recursive = FALSE,
                ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE)
> filelist
[1] "dat1.txt" "dat2.txt"

datalist <- lapply(filelist, function(x) read.table(x, header = T))

> datalist[1]
[[1]]
x          y
1   0.66407205  0.6380669
2  -0.85676390  0.3987090
3   1.23954448  0.7414505
4  -0.11823676 -0.1658559
5   1.41603036  0.5585108
6   2.16411026 -1.0918350
7  -0.54033389  0.3603718
8   0.01530916  0.5687294
9   0.06244237 -1.1000696
10 -0.15826680 -2.5999726

> datalist[2]
[[1]]
x           y           z
1  0.09159357 -0.80349348  0.04728642
2  0.21526376 -0.03353738  0.77563529
3  0.17405957 -0.68228875  0.72500158
4 -1.81829362 -1.59196023 -1.25275570
5 -1.92814438 -0.07139163 -0.08759747

如果您需要访问个人数据集

> tmp <- datalist[[2]]
> dim(tmp)
[1] 5 3
> names(tmp)
[1] "x" "y" "z"
> tmp$y
[1] -0.80349348 -0.03353738 -0.68228875 -1.59196023 -0.07139163

答案 1 :(得分:0)

OOOOH MYYY GOODNESS !!!过了我几个小时,但设法通过试验给我的脚本来解决这个问题! 我对此表示赞同:

sam <- dir(path = "~/MSc/Course/Module3", pattern = "*.txt", all.files = FALSE,
                full.names = FALSE, recursive = FALSE,  
                ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE)

X <- matrix(nrow=1, ncol=1686)

for (i in 1:length(sam)) {N <- read.table(sam[i], sep="\t", header=F, row.names=NULL)
                          X <- rbind (X, N[,2])  }
rownames(X) <- c("temp", "A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3", "D1", "D2", "D3", "E1", "E2", "E3")
X <- X[-1,]