2013-11-23 3 views
0

Приветствую вас, прекрасные люди. Я новичок в R и Matlab и искал в сети, чтобы ответить на это, но не нашел ничего. Проблема в том, что когда я создаю финальную матрицу, она просто перечисляет имена файлов.Чтение имен файлов вместо данных внутри файлов

Фон за это, так что вы понимаете, что я имею в виду:

Я использую R с встроенным MATLAB и пытаюсь прочитать данные из 15 .txt files.These 15 файлов все имеют 2 колонки данных и 1686 строк. Я должен помещать эти файлы в вектор списка типов, используя функцию dir(). Затем я должен получить доступ к каждому элементу этого вектора и передать его функции read.table(), чтобы я мог создать матрицу N, которая содержит данные. Как упоминалось ранее, эти файлы имеют 2 столбца, и мне говорят, чтобы извлечь 1-й столбец каждого файла и поместить его в i-й столбец матрицы с именем X. X имеет 16 строк для представления 15 файлов и строки заголовка и столбцов 1687 для данных и отклонения первого столбца.

Когда я набираю X в консольном бите R-студии, он приходит с ошибкой в ​​X [i,] < - t (N [, 1]): количество элементов для замены не кратно замещающей длины ,

Я считал, что достаточно хорошо, я изменил X на матрицу 15 на 15, вместо этого вместо нее был найден матрикс, содержащий имена файлов .txt, а не нужные мне данные. Прежде всего я хочу решить эту ошибку имен файлов, прежде чем попытаться решить проблему с множественной заменой длины. Это что-то не так в моем коде? я написал ниже код, как если бы для 15 х 15 матрицы, чтобы продемонстрировать проблему имя файла, а не 16 х 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

NO волнуется ребята, fiiiiinaaaaaallly удалось сделать это заняло у меня несколько часов экспериментирования со скриптом друг прислал мне. Они прислали мне этот сценарий. –

ответ

0

Оего MYYY благость !!! позаботился обо мне, но сумел решить это, поэкспериментировав со сценарием, который мне дал! Я amendeded его к этому:

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,] 
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 
Смежные вопросы