如何将列表和矩阵组合到数据框中

时间:2014-01-08 11:40:51

标签: r matrix dataframe

所以我有一个关于荷兰海岸的大型数据集,他们将荷兰海岸划分为不同的区域,在这些区域沿海滩有多个横断面,他们每隔五米测量一次海拔高度。他们根据彼此的距离命名了不同的横断面。

这个数据是在netcdf文件中,但我终于得到了一个非常好的矩阵,看起来像这样:

> a<-matrix(c(100,80,60,40,200,180,160,140),nrow=4,ncol=6)
> colnames(a) <- c(100,200,300,400,100,101)
> rownames(a) <- c(500,400,300,200)
> a
    100 200 300 400 100 101
500 100 200 100 200 100 200
400  80 180  80 180  80 180
300  60 160  60 160  60 160
200  40 140  40 140  40 140

列名是海滩沿岸的不同横断面,行名称是跨岸距离。

然而,不同横断面的“名称”通常对于荷兰海岸的不同区域是相同的。现在我有一个区域列表,我可以很好地将其放入矩阵中:

> b <- c(2,2,2,2,3,3)
> c<-rbind(b,a)
> c
    100 200 300 400 100 101
b     2   2   2   2   3   3
500 100 200 100 200 100 200
400  80 180  80 180  80 180
300  60 160  60 160  60 160
200  40 140  40 140  40 140 

然而,当我制作这个矩阵的数据帧时,我得到了这个:

> d<-as.data.frame(as.table(c))
> d
   Var1 Var2 Freq
1     b  100    2
2   500  100  100
3   400  100   80
4   300  100   60
5   200  100   40
6     b  200    2
7   500  200  200
8   400  200  180
9   300  200  160
10  200  200  140
11    b  300    2
12  500  300  100
13  400  300   80
14  300  300   60
15  200  300   40
16    b  400    2
17  500  400  200
18  400  400  180
19  300  400  160
20  200  400  140
21    b  100    3
22  500  100  100
23  400  100   80
24  300  100   60
25  200  100   40
26    b  101    3
27  500  101  200
28  400  101  180
29  300  101  160
30  200  101  140

我想要的是b(所以不同的沿海地区)是一个额外的列。

所以它看起来像这样:

Var1 Var2 Freq var3

2   500  100  100   2
3   400  100   80   2
4   300  100   60   2
5   200  100   40   2
7   500  200  200   2
8   400  200  180   2
9   300  200  160   2
10  200  200  140   2
12  500  300  100   2
13  400  300   80   2
14  300  300   60   2
15  200  300   40   2
17  500  400  200   2
18  400  400  180   2
19  300  400  160   2
20  200  400  140   2
22  500  100  100   3
23  400  100   80   3
24  300  100   60   3
25  200  100   40   3
27  500  101  200   3
28  400  101  180   3
29  300  101  160   3
30  200  101  140   3

我不确定如何做到这一点,这些数据来自netcdf文件,也许我没有以正确的方式传输...此外我的数据集当然要大得多,这只是一个小的示例看起来如何。如果我能提供更多信息,请说出来。

1 个答案:

答案 0 :(得分:0)

ab包含不同的数据类型,因此您不应将它们组合在一个矩阵中。保持它们分开也会使您的代码更简单。

您可以使用a中的meltreshape2从宽格式转换为长格式。

library(reshape2)
cbind(melt(a), rep(b, each = nrow(a)))