Lag in R датафрейм - PullRequest
       6

Lag in R датафрейм

2 голосов
/ 03 апреля 2012

У меня есть следующий примерный набор данных (ниже и / или в виде CSV здесь: http://goo.gl/wK57T), который я хочу преобразовать следующим образом. Для каждого члена домохозяйства я хочу создать две новые переменные OrigTAZ и DestTAZ. Это следует взять значение в TripendTAZ и поместить его в DestTAZ. Для OrigTAZ следует указать значение TripendTAZ из предыдущего ряда. Для первой поездки каждого человека в домашнем хозяйстве (Tripid = 1) OrigTAZ = hometaz. Для каждого человека в домашнее хозяйство, из второй поездки OrigTAZ = TripendTAZ_ (n-1) и DestTAZ = TripEndTAZ. Пример входных и выходных данных показан ниже. Я попробовал предложения, показанные здесь: Базовое отставание в R vector / dataframe , но мне не повезло. Я привык делать что-то подобное в SAS.

Любая помощь приветствуется.

ТИА, Кришнан

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

1 Ответ

3 голосов
/ 03 апреля 2012

Просто выполните пошаговые шаги, которые вы обрисовали в общих чертах, и это не так уж и плохо.

Сначала я прочитаю ваши данные, скопировав их:

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 - это то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...