通过将多个列元素粘贴到一行并重复该过程来创建矩阵

时间:2014-05-15 13:07:04

标签: r

我目前正在为全市11个不同的车站开展一年的空中轨道研究。 对于每个站,我有72小时轨迹的数据帧,看起来像这样

      date      lon/lat
    yymmddhh_1   lon_1
    yymmddhh_1   lat_1
    yymmddhh_1   lon_2
    yymmddhh_1   lat_2
    yymmddhh_1   lon_3
    yymmddhh_1   lat_3

我没有将经度和纬度值放在不同的列中,因为我需要将它们放在一个列中进行分析。

日期列以某一天开始(在我的情况下为011022:22/10/2001)并以1小时为单位向后退72小时,留下146个独立的lon / lat值。我的轨迹为329天,因此数据帧的维度为dim = 48180 x 2.

现在我需要一个新的数据框,其中列是我的后退时间步长(t-0,t-1,t-2,...,t-72),每行代表一个轨迹(yymmddhh_1,yymmddhh_2,... 。,yymmddhh_329)。

   date       t-0     t-0     t-1     t-1
yymmddhh_1   lon_1   lat_1   lon_2   lat_2
yymmddhh_2   lon_1   lat_1   lon_2   lat_2
yymmddhh_3   lon_1   lat_1   lon_2   lat_2

所以我认为我的代码需要读取当前数据帧的第2列,直到行= 146,将这些值写入新数据帧的第一行,然后重复该过程,直到达到数据帧的末尾。

我已经设法为前146个值做了这个,这很容易,因为我只需要

trajectory_1 <- t(station.trajectory[1:146,2]) 

我也已经创建了日期列。

也许我可以使用read.table?我真的不知道从哪里开始,所以任何帮助都会受到高度赞赏。

编辑:为了清理,这里是一个当前数据框架的示例,以及新的框架应该是什么样的:

[,1]是日期(格式:YYMMDDHH),[,2]是lon,lat值

        [,1]   [,2]

[1,] 2071000 525500

[2,] 2071000 133300

[3,] 2070923 524918

[4,] 2070923 134759

[5,] 2070922 524238

[6,] 2070922 136058

...

[146,] 2070700 140147

[147,] 2071100 525500

[148,] 2071100 133300

[149,] 2071023 525142

[150,] 2071023 128926

请注意,在[147,] [1,]之后的[,1]天的新轨迹开始。

保持[,2]的内容在这里并不重要,我的代码到底应该是什么,取 [,1] [,2] [,3] [,4] [,5] [1,] 2071000 525500 133300 524918 134759 [2,] 2071100 ... ... ... ... 并使它看起来像这样:

ind1<- matrix()
ind1 <- cbind(seq(0,48034,146))
ind1[1,] <- 1

编辑2:我还应该补充一点,我正在尝试为k均值聚类(http://stat.ethz.ch/R-manual/R-devel/library/stats/html/kmeans.html)准备数据。也许我没有正确理解手册,但对我而言,看起来每条轨迹都应该有自己的行......

编辑3:

我尝试编写循环来完成工作。

beusselstr.dataframe

首先,我创建了一个索引,步骤为146.我的最终数据框应命名为beusselstr.dataframe <- NULL k<- NULL

for (j in 1:115){
  k[j] <- ind1[j+1]
beusselstr.dataframe[j] <- cbind(beusselstr.dataframe[j],t(beusselstr.trajectories[ind1[j]:k[j],2])) 
  }

电台“beusselstr”只有115天,所以我想只使用前115个指数值,直到16790:

"number of items to replace is not a multiple of replacement length"

但是我收到错误{{1}}。

1 个答案:

答案 0 :(得分:0)

首先,让我们生成一些玩具数据:

df = as.data.frame(matrix(c(seq(2070700,2070700-72*2+1,-1),seq(2071100,2071100-72*2+1,-1),runif(72*4)),ncol=2))
colnames(df) = c('date','lon.lat')
df$date[seq(2,nrow(df),2)] = df$date[seq(1,nrow(df)-1,2)]

这是一个表示两个坐标序列的矩阵,类似于你的例子,除了日期格式有点不同。重要的是每个日期重复两次。

接下来,我建议的方法依赖于对数据进行排序。如果您的数据混乱,您应该在继续之前重新订购它:

df = df[order(df$date),]

诀窍是以简单的方式进行重塑,即添加标记来自同一实验(rec.nb)和相对时间(rec.time)的记录的新列。由于您的数据现已排序,您需要做的就是:

df$rec.nb = rep(seq(1:2),each=72*2)
df$rec.time = rep(seq(1:72),2)

(如果您有3个轨迹,则可以放置:df$rec.nb = rep(seq(1:3),each=72*3)等等)

您的数据框现在应如下所示:

     date    lon.lat rec.nb rec.time
1 2070700 0.47047887      1        1
2 2070700 0.26357648      1        2
3 2070698 0.10793420      1        3
4 2070698 0.09126992      1        4
5 2070696 0.75242114      1        5
6 2070696 0.85941990      1        6
[...]
142 2070560 0.5561255161      1       70
143 2070558 0.7901997303      1       71
144 2070558 0.6179680785      1       72
145 2071100 0.0926457571      2        1
146 2071100 0.7780607140      2        2
147 2071098 0.7008311108      2        3

最后,您可以reshape您的数据:

reshape(df,v.names='lon.lat',timevar='rec.time',idvar='rec.nb',direction='wide')

输出以下内容:

       date rec.nb  lon.lat.1 lon.lat.2 lon.lat.3  lon.lat.4 lon.lat.5   [...]
1   2070700      1 0.47047887 0.2635765 0.1079342 0.09126992 0.7524211   [...]
145 2071100      2 0.09264576 0.7780607 0.7008311 0.48613669 0.4928686   [...]