我目前正在为全市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}}。
答案 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 [...]