将代码从Matlab转换为R.

时间:2016-10-17 15:30:36

标签: r matlab loops matrix spatial

Example of My Data

我有三个矩阵csv数据文件,我需要在R中展平和组合,这样我就有三列(Lat,Long,Data)。我对此的代码是在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文件不会改变,只是数据文件。 谢谢!!

1 个答案:

答案 0 :(得分: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)

然后,我们遍历列表,将每个data.frame转换为矩阵,然后将值提取为向量。然后,我将结果列表转换为data.frame以获取您可能想要的列/行行为(data.frames只是具有特殊属性的列表;每列都是列表的元素,但data.frames假定值为order比赛)。请注意,我使用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

值得注意的是,您提到您可能要合并多个数据源 - 只要将它们全部加载到此列表中,该方法将为每个数据源生成一列。