2016-10-17 9 views
-1

Example of My DataПреобразование кода из Matlab в R

У меня есть три матричных файлов CSV данных, которые мне нужно расплющить и объединить в R, так что у меня есть три колонки (Lat, Long, данные). Код, который у меня есть для этого, находится в matlab, но мне нужно преобразовать это в R. Любые мысли? Это MATLAB код, который делает это:

LON=csvread(‘LONGITUDE.csv’); 
LAT=csvread(‘LATITUDE.csv’); 
SM=csvread(‘soil_moisture20151008.csv’); 
xyz=zeros(101*210,3); 
k=0; 
for i=1:101 
    for j=1:210 
     k=k+1; 
     xyz(k,1)=LAT(i,j); 
     xyz(k,2)=LON(i,j); 
     xyz(k,3)=SM(i,j); 
    end 
end 
csvwrite(‘xyz.csv’,xyz); 

До сих пор это, как я изменил его в R:

LON<-read.csv("LONGITUDE.csv", header = T) 
LAT<-read.csv("LATITUDE.csv", header = T) 
ET<-read.csv("actual_ET20100101.csv") 

xyz=matrix(3,101,210) 
k=0 
for (i in 1:101){ 
    for (j in 1:210){ 
     k=k+1 
     xyz[k,1]=LAT[i,j] 
     xyz[k,2]=LON[i,j] 
     xyz[k,3]=ET[i,j] 
    } 
} 

write.csv("xyz.csv",xyz); 

Я не уверен, что я делаю неправильно. Любые рекомендации по этому вопросу будут весьма признательны.

Наконец, у меня есть целый каталог файлов, которые мне нужны для запуска этого скрипта, поэтому любые идеи о том, как применить это к каталогу, будут отличными. Файлы LAT/LON не меняются, а только файлы данных. спасибо !!

+0

'xyz = matrix (3,101,210)' явно не совпадает с 'xyz = нулями (101 * 210,3)'. – Roland

+0

Btw., Вы действительно не хотите использовать такой цикл в R. Используйте векторизованный подход для повышения эффективности. – Roland

+0

Возможно, это поможет опубликовать фрагмент данных из каждого источника (например, 'dput (LAT [1: 6, 1: 6])'). Как сказал @Roland: неясно, что именно вы пытаетесь сделать, не видя данных. Цикл, который вы используете, почти наверняка не самый чистый подход. –

ответ

1

Если я правильно понимаю ваши данные, у вас есть большое количество матричных файлов, где каждому индексу (позиция строки/столбца) присваивается одно и то же значение данных. То есть, (1,1) в каждой матрице дает интересующую ценность для 1-й точки данных, а (1,2) дает значения для другой точки данных.

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

Для иллюстрации, здесь три одинаковых data.frames (так что мы можем увидеть, если они правильно выравнивать:

A <- B <- C <- 
    data.frame(matrix(runif(36), nrow = 6)) 

Каждый data.frame это:

  X1  X2   X3  X4  X5  X6 
1 0.2462450 0.6887587 0.216578122 0.5982332 0.2402868 0.9588999 
2 0.5924075 0.7511237 0.813704807 0.6892747 0.6253069 0.4648226 
3 0.7482773 0.4808986 0.006036452 0.6576487 0.5752148 0.5554258 
4 0.8545323 0.6822942 0.654128179 0.6582181 0.8173544 0.5191778 
5 0.1748737 0.7456279 0.992209169 0.4468014 0.3491022 0.9736064 
6 0.7189847 0.3424291 0.581840006 0.1460138 0.8071445 0.2920479 

Затем я поставил они все в list (по имени, так что столбцы Выходи по имени):

myList <- list(A = A, B = B, C = C) 

Тогда мы вот op через список, преобразование каждого data.frame в матрицу, а затем извлечение значений в виде вектора. Затем я конвертирую полученный список в файл data.frame, чтобы получить нужное поведение столбца/строки (data.frames - это просто списки со специальными свойствами, каждый столбец является элементом списка, но data.frames принимает порядки значений совпадение). Обратите внимание, что я использую magrittr/dplyr трубопроводов для упрощения вложенности в коде:

flattened <- 
    lapply(myList, function(x){ 
    as.matrix(x) %>% 
     as.numeric() 
    }) %>% 
    as.data.frame() 

Затем глава этого (от моей рандомизации) выглядит следующим образом:

  A   B   C 
1 0.2462450 0.2462450 0.2462450 
2 0.5924075 0.5924075 0.5924075 
3 0.7482773 0.7482773 0.7482773 
4 0.8545323 0.8545323 0.8545323 
5 0.1748737 0.1748737 0.1748737 
6 0.7189847 0.7189847 0.7189847 

Следует отметить, что вы упомянули что у вас может быть несколько источников данных, которые вы хотите объединить, - пока вы загружаете их все в этот список, подход будет генерировать столбец для каждого.

+0

@ Роланд см. «Пример моих данных», чтобы посмотреть, как структурированы данные. Его три матрицы (Lat, Lon, Data), которые необходимо объединить и сгладить, чтобы я получил три столбца. Lat, Lon, Data. –

+0

безупречный! спасибо Mark –

+0

еще один вопрос: так что, если я хочу применить это к каталогу более 2000 файлов, как бы я это сделал. Файлы Lat и Lon остаются неизменными, но файлы данных будут отличаться. Я попробовал несколько вещей, но пока не удался. –

Смежные вопросы