大家好,你好。 我是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])
答案 0 :(得分:1)
试用应用函数,apply
,sapply
,mapply
等。
由于您正在处理文件列表,因此您需要的是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,]