将代码从 Matlab 转换为 R

Convert code from Matlab to R

Example of My Data

我有三个矩阵 csv 数据文件,我需要在 R 中展平和合并它们,这样我就有了三列(纬度、经度、数据)。我的代码在 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 文件没有变化,只有数据文件。 谢谢!!

如果我对您的数据的理解正确,您有大量矩阵文件,其中每个索引(row/column 位置)都分配给相同的数据值。也就是说,每个矩阵中的 (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 以获得您可能想要的 column/row 行为(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

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