我有大量车辆数据。它们每0.1秒记录一次,因此在Vehicle ID列中重复ID。总共有2169辆车。我过滤了每辆车的“车辆速度”列(使用for循环),这导致了一个新列,其中删除了第一个和最后30个值(每辆车)。为了将它与原始数据框绑定,我也删除了表的第一个和最后30个值,然后使用cbind()组合它们。这适用于最后一辆车。我想要所有车辆的平滑和列绑定,最后我想将车辆的所有数据框组合成一个单独的表。这意味着按车辆ID的顺序进行行绑定。这是我到目前为止写的:
traj1 <- read.csv('trajectories-0750am-0805am.txt', sep=' ', header=F)
head(traj1)
names (traj1)<-c('Vehicle ID', 'Frame ID','Total Frames', 'Global Time','Local X', 'Local Y', 'Global X','Global Y','Vehicle Length','Vehicle width','Vehicle class','Vehicle velocity','Vehicle acceleration','Lane','Preceding Vehicle ID','Following Vehicle ID','Spacing','Headway')
# TIME COLUMN
Time <- sapply(traj1$'Frame ID', function(x) x/10)
traj1$'Time' <- Time
# SMOOTHING VELOCITY
smooth <- function (x, D, delta){
z <- exp(-abs(-D:D/delta))
r <- convolve (x, z, type='filter')/convolve(rep(1, length(x)),z,type='filter')
r
}
for (i in unique(traj1$'Vehicle ID')){
veh <- subset (traj1, traj1$'Vehicle ID'==i)
svel <- smooth(veh$'Vehicle velocity',30,10)
svel <- data.frame(svel)
veh <- head(tail(veh, -30), -30)
fta <- cbind(veh,svel)
}
'fta'现在仅显示最后一辆车的数据框。但是我想要所有数据帧(对于所有车辆'i')按行组合。可能for循环不是正确的方法,但我不知道如何使用tapply(或任何其他应用函数)同时执行这么多事情。
我无法在此重现我的数据集,但R中的'Orange'数据集可以提供很好的类比。使用相同的平滑函数,for循环看起来像这样(如果'age'列被平滑,'Tree'列相当于我的'Vehicle ID'coulmn):
for (i in unique(Orange$Tree)){
tre <- subset (Orange, Orange$'Tree'==i)
age2 <- round(smooth(tre$age,2,0.67),digits=2)
age2 <- data.frame(age2)
tre <- head(tail(tre, -2), -2)
comb <- cbind(tre,age2)}
}
答案 0 :(得分:2)
Umair,我不确定我明白你想要什么。
如果我理解正确,您希望按行合并所有结果。为此,您可以将所有结果保存在列表中,然后do.call
rbind
:
comb <- list() ### create list to save the results
length(comb) <- length(unique(Orange$Tree))
##Your loop for smoothing:
for (i in 1:length(unique(Orange$Tree))){
tre <- subset (Orange, Tree==unique(Orange$Tree)[i])
age2 <- round(smooth(tre$age,2,0.67),digits=2)
age2 <- data.frame(age2)
tre <- head(tail(tre, -2), -2)
comb[[i]] <- cbind(tre,age2) ### save results in the list
}
final.data<-do.call("rbind", comb) ### combine all results by row
这会给你:
Tree age circumference age2
3 1 664 87 687.88
4 1 1004 115 982.66
5 1 1231 120 1211.49
10 2 664 111 687.88
11 2 1004 156 982.66
12 2 1231 172 1211.49
17 3 664 75 687.88
18 3 1004 108 982.66
19 3 1231 115 1211.49
24 4 664 112 687.88
25 4 1004 167 982.66
26 4 1231 179 1211.49
31 5 664 81 687.88
32 5 1004 125 982.66
33 5 1231 142 1211.49
只是为了好玩,使用plyr::ddply
和sapply
使用split
以不同方式执行此操作:
library(plyr)
data<-ddply(Orange, .(Tree), tail, n=-2)
data<-ddply(data, .(Tree), head, n=-2)
data<- cbind(data,
age2=matrix(sapply(split(Orange$age, Orange$Tree), smooth, D=2, delta=0.67), ncol=1, byrow=FALSE))