Моего Отправное состояния что-то вроде рамки df
данныхУсловное создание колонки (горизонтальные и вертикальные условия)
df<-data.frame(id=c(rep(2, 3), rep(4, 2)), year=c(2005:2007, 2005:2006), event=c(1,0,0,0,1))
id year event
1 2 2005 1
2 2 2006 0
3 2 2007 0
4 4 2005 0
5 4 2006 1
У меня есть ряд актеров (идентифицированных через ид), которые происходят испытать событие в определенном год.
Здесь я пытаюсь построить ряд дополнительных столбцов, которые описывают а) расстояние от событий и б) является ли такое расстояние наблюдаемым.
Это то, что я хотел бы получить.
id year event evm2 evm1 evp1 evp2 ndm2 ndm1 ndp1 ndp2
1 2 2005 1 0 0 0 0 1 1 0 0
2 2 2006 0 0 1 0 0 1 0 0 1
3 2 2007 0 1 0 0 0 0 0 1 1
4 4 2005 0 0 0 1 0 1 1 0 1
5 4 2006 1 0 0 0 0 1 0 1 1
event
равен 1, когда происходит событие в определенном году. evm1
равно 1, когда событие можно наблюдать за год до этого. Аналогично, evp1
равно 1, если событие находится в следующем году - буквы p
или m
подставка для «плюс» и «минус», а цифры представляют собой расстояние в годах от события. Для некоторых из этих наблюдений расстояние не наблюдается, поскольку доступное временное окно слишком короткое. Это относится к df[1,]
, для которого мы не знаем, произошло ли в предыдущие годы событие или нет. В таком случае, ndm1
и ndm2
кодируются 1. Если мы рассмотрим случай df[5,]
, это будет ndp1
(и ndp2
) должны быть закодированы 1. ev
и nd
переменных работают точно таким же образом. Но первый говорит, что на определенном расстоянии есть какое-то событие или нет, и последнее показывает, действительно ли такое расстояние действительно наблюдаемо.
Я попытался выполнить это, используя следующие вложенные петли, но мне это не удалось.
lag<-c(-2, -1, 1, 2)
df2<-df
df2[,4:11]<-0
colnames(df2)<-c("id", "year", "event", "evm2", "evm1", "evp1", "evp2", "ndm2", "ndm1", "ndp1", "ndp2")
for (i in length(df2$id)) {
id<-df2[i,1]
yr<-df2[i,2]
sta<-3
sta2<-7
for (j in lag){
sta<-sta+1
sta2<-sta2+1
if !is.null(df2[df2$id==id & df2$year==yr+j])==TRUE {
rw<-which(df2[df2$id==id & df2$year==yr+j])
if (df2[rw,3]==1) df2[i, sta]==1
} else {
df2[i, sta2]==1
}
}
}
Вы видите что-нибудь, что может быть причиной ошибок? Я два дня схожу с ума, пытаясь заставить его работать, и я был бы очень благодарен, если бы вы могли помочь.
Отсутствуют скобки вокруг условия 'if' - это первое. И вам не нужно проверять равенство с «ИСТИНА». Это должно быть: 'if (! Is.null (df2 [df2 $ id == id & df2 $ year == yr + j]))' Однако я не уверен, что это единственная проблема. –
Можно ли предположить, что для данного 'id', у вас всегда есть данные для набора не менее двух непрерывных и отсортированных лет? Если это так, я могу показать короткое и векторизованное решение. – flodel
@musically_ut Большое спасибо за ваш комментарий. Вы совершенно правы. То, что все еще не работает, это то, что функция. У вас есть идея, почему? – Riccardo