如何列绑定和行绑定R中的大量数据帧?

时间:2014-02-15 00:23:40

标签: r

我有大量车辆数据。它们每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)}
}

1 个答案:

答案 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::ddplysapply使用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))