2012-04-02 25 views
2

我想要按如下方式转换以下示例数据集(下面和/或作为CSV:http://goo.gl/wK57T)。对于家庭中的每个人,我想创建两个新变量OrigTAZ和DestTAZ。它应该将TripendTAZ中的值放入DestTAZ中。对于OrigTAZ,它应该把TripendTAZ的值放在前一行。对于每个家庭的第一次旅行(Tripid = 1),OrigTAZ = hometaz。对于家庭中的每个人,从第二次旅行OrigTAZ = TripendTAZ_(n-1)和DestTAZ = TripEndTAZ。示例输入和输出数据如下所示。我尝试了这里显示的建议:Basic lag in R vector/dataframe但没有运气。我习惯在SAS中做这样的事情。R dataframe中的延迟

任何帮助表示赞赏。

TIA, 克里希南

SAS Code Sample 
    if Houseid = lag(Houseid) then do; 
     if Personid = lag(Personid) then do; 
      DestTAZ = TripendTAZ; 
     if Tripid = 1 then OrigTAZ = hometaz 
     else 
     OrigTAZ = lag(TripendTAZ); 
     end; 
    end; 

输入数据

Houseid,Personid,Tripid,hometaz,TripendTAZ 
1,1,1,45,4 
1,1,2,45,7 
1,1,3,45,87 
1,1,4,45,34 
1,1,5,45,45 
2,1,1,8,96 
2,1,2,8,4 
2,1,3,8,2 
2,1,4,8,1 
2,1,5,8,8 
2,2,1,8,58 
2,2,2,8,67 
2,2,3,8,9 
2,2,4,8,10 
2,2,5,8,8 
3,1,1,7,89 
3,1,2,7,35 
3,1,3,7,32 
3,1,4,7,56 
3,1,5,7,7 

输出数据

Houseid,Personid,Tripid,hometaz,TripendTAZ,OrigTAZ,DestTAZ 
1,1,1,45,4,45,4 
1,1,2,45,7,4,7 
1,1,3,45,87,7,87 
1,1,4,45,34,87,34 
1,1,5,45,45,34,45 
2,1,1,8,96,8,96 
2,1,2,8,4,96,4 
2,1,3,8,2,4,2 
2,1,4,8,1,2,1 
2,1,5,8,8,1,8 
2,2,1,8,58,8,58 
2,2,2,8,67,58,67 
2,2,3,8,9,67,9 
2,2,4,8,10,9,10 
2,2,5,8,8,10,8 
3,1,1,7,89,7,89 
3,1,2,7,35,89,35 
3,1,3,7,32,35,32 
3,1,4,7,56,32,56 
3,1,5,7,7,56,7 

回答

3

通过您介绍了一步的步骤,只是继续一步,并没有那么糟糕。

首先,我将在您的数据通过复制上面写着:

df <- read.csv(file('clipboard')) 

然后,我会为您解决,以确保数据帧由houseid排序,然后PERSONID,然后TRIPID:

# first sort so that it's ordered by Houseid, then Personid, then Tripid: 
df <- with(df, df[order(Houseid,Personid,Tripid),]) 

然后按照指定的步骤:

# take value in TripendTAZ and put it in DestTAZ 
df$DestTAZ <- df$TripendTAZ 

# Set OrigTAZ = value from previous row 
df$OrigTAZ <- c(NA,df$TripendTAZ[-nrow(df)]) 

# For the first trip of every person in a household (Tripid = 1), 
# OrigTAZ = hometaz. 
df$OrigTAZ[ df$Tripid==1 ] <- df$hometaz[ df$Tripid==1 ] 

你会发现,df然后什么你在追求。

+0

感谢数学咖啡。这工作完美。 – Krishnan 2012-04-03 02:19:32