2015-08-26 4 views
0

Я создал скрипт для чтения 15 файлов данных, вычисляя разницу между двумя файлами и записывая результаты в 5 разных файлов. Эти 5 файлов - это матрицы, значения 10x259. Мне нужно создать матрицу, в которой каждый элемент будет средним по элементам в том же положении в предыдущих 5 матрицах. Я не могу усреднить работу.-Чтобы вычислить среднее значение для 2D-матрицы в цикле

Я пробовал классический способ «sum = sum + i» внутри цикла, но R дает ошибку для рекурсивной суммы. Я попытался сделать 3-мерную матрицу и заполнить ее 5-дюймовыми страницами, содержащими 2D-матрицы, но я получаю ошибки, пытаясь заполнить матрицу содержимым другого размера. Я попытался с rowMeans(), но не могу заставить его выполнять работу, так как мне нужно получить среднее из 5 итераций одной и той же переменной.

Единственный способ, которым я мог это сделать, - снова считывать все результирующие файлы в отдельные переменные, добавлять их и делить на 5. Но это работает только для нескольких файлов. Мне нужно будет распространяться на многие файлы, поэтому мне нужно как-то заставить его работать в цикле.

Может ли кто-нибудь дать мне лучшую идею?

Я новичок в R. Скрипт, вероятно, очень неэффективен, но ему нужно только выполнить эту работу.

Ниже мой код:

MAM <- c("M","N","O","P","R") 
S <-c("a","b","c","d","e") 
T<-c("a","b","c","d","e") 
V<-c("a","b","c","d","e") 

Min2000<- array(3,dim=c(259,10,5)) 
Min2010<- array(5,dim=c(259,10,5)) 

    # this will be done 5 times 
for (i in 1:5) { 

    # preparing file names to be read 
    S[i] <- paste(MAM [i],"2000.txt",sep="_") 
    T[i] <- paste(MAM [i],"2150.txt",sep="_") 
    V[i] <- paste(MAM [i],"2250.txt",sep="_") 

    # import data from the files 
    file1 <- read.table(S[i], header=TRUE,sep="\t") 
    file2 <- read.table(T[i], header=TRUE,sep="\t") 
    file3 <- read.table(V[i], header=TRUE,sep="\t") 

    # delete the first column 
    file1[,2:11] 
    file2[,2:11] 
    file3[,2:11] 
    file1a <- file1[,c(2:11)] 
    file2a <- file2[,c(2:11)] 
    file3a <- file3[,c(2:11)] 

    # compute data 
    Min2000<- (file2a-file1a)/file1a 
    Min2010<- (file3a-file1a)/file1a 

    colMeans(Min2000) 
    #cub[,,i]= Min2000 #doesn'twork 
    #rowMeans(datamonth, dims = 2) #doesn'twork 
} 

ответ

0

Попробуйте это, смотрите комментарии в коде для объяснения

# load library 
library(dplyr) 

# Create vectors of names to be read in 
MAM <- c("M","N","O","P","R") 
S.Name <- paste(MAM,"2000.txt",sep="_") 
T.Name <- paste(MAM,"2150.txt",sep="_") 
V.Name <- paste(MAM,"2250.txt",sep="_") 

# Read in data into list and drop first column 
S = lapply(S.Name, read.table, header = T, sep = "\t") %>% lapply(function(x) x[,-1]) 
T = lapply(T.Name, read.table, header = T, sep = "\t") %>% lapply(function(x) x[,-1]) 
V = lapply(V.Name, read.table, header = T, sep = "\t") %>% lapply(function(x) x[,-1]) 

# Sum up the files, then divide to find mean. 
# This does (matrix1 + matrix2 + matrix3 + matrix4 + matrix5)/# of matrices 
S = S %>% {Reduce("+", .)/length(S)} 
T = T %>% {Reduce("+", .)/length(T)} 
V = V %>% {Reduce("+", .)/length(V)} 
0

Здесь возможны два варианта:

Min2000<- array(NA,dim=c(259,10,5)) 
Min2010<- array(NA,dim=c(259,10,5)) 

# this will be done 5 times 
for (i in 1:5) { 

    # import data from the files 
    file1 <- matrix(sample(1:10,2849,replace=TRUE),259,11) 
    file2 <- matrix(sample(1:10,2849,replace=TRUE),259,11) 
    file3 <- matrix(sample(1:10,2849,replace=TRUE),259,11) 

    # delete the first column 
    file1a <- file1[,-1] 
    file2a <- file2[,-1] 
    file3a <- file3[,-1] 

    # compute data 
    Min2000[,,i] <- (file2a-file1a)/file1a 
    Min2010[,,i] <- (file3a-file1a)/file1a 
} 

A2 <- apply(Min2000,1:2,"mean") 
A3 <- apply(Min2010,1:2,"mean") 

.

Sum2 <- matrix(0,259,10) 
Sum3 <- matrix(0,259,10) 

# this will be done 5 times 
for (i in 1:5) { 

    # import data from the files 
    file1 <- matrix(sample(1:10,2849,replace=TRUE),259,11) 
    file2 <- matrix(sample(1:10,2849,replace=TRUE),259,11) 
    file3 <- matrix(sample(1:10,2849,replace=TRUE),259,11) 

    # delete the first column 
    file1a <- file1[,-1] 
    file2a <- file2[,-1] 
    file3a <- file3[,-1] 

    # compute data 
    Sum2 <- Sum2 + (file2a-file1a)/file1a 
    Sum3 <- Sum3 + (file3a-file1a)/file1a 
} 

B2 <- Sum2/5 
B3 <- Sum3/5 

Я заменил файлы случайными матрицами.

В результате почти то же самое:

> max((A2-B2)^2) 
[1] 7.888609e-31 

> max((A3-B3)^2) 
[1] 7.888609e-31 
+0

Я предполагаю, что матрицы имеют действительно 10 строк и 259 столбцов, а не наоборот. – mra68

+0

Я изменил решение таким образом, что «file1» , «file2» и «file3» - 259x11-матрицы. – mra68

0

Спасибо вам обоим за ваши ответы.

mra68, я попробовал оба решения. Первый (с: A2 < - применяется (Min2000,1: 2, «mean» и A3 < - apply (Min2010,1: 2, «mean») дает мне ошибку. Второе решение работает отлично (с: B2 < - Sum2/5, B3 < - Sum3/5). Я получил среднее значение, которое мне было нужно.

Vlo, я попробовал библиотеку, но с вашим кодом я могу сделать только сумму между 10 столбцами и средним значением из этих столбцов.Я хотел, чтобы среднее между 5 отличными, а не между 10 столбцами.Код делает больше, чем мне удалось в начале, но это не совсем то, что мне нужно.