我有三个矩阵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文件不会改变,只是数据文件。 谢谢!!
答案 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
值得注意的是,您提到您可能要合并多个数据源 - 只要将它们全部加载到此列表中,该方法将为每个数据源生成一列。