У меня есть эта структура данных ниже и вам нужно создать столбец на основе ассоциаций с элементом A в течение получаса до и после, а также присутствовать в соседних областях (сосед определяется как +1 и -1 области).Подгруппы в рамках фрейма данных, основанные на соседних свойствах, на элемент
ind area time
B 5 3/12/1981 7:20
D 6 3/12/1981 7:25
A 5 3/12/1981 7:40
B 4 3/12/1981 7:40
A 7 8/29/1982 10:00
A 31 9/12/1982 9:50
C 30 9/12/1982 9:50
A 69 4/10/1985 13:37
Желаемый результат представляет собой колонку с теми случаями, когда индивидуум происходит в пределах заданного диапазона (в течение получаса до/после индивидуальной А присутствуют, а также в пределах интервал +1 и -1 области где присутствует отдельный А). В идеале, это будет выглядеть следующим образом:
ind area time instance
B 5 3/12/1981 7:20 1
D 6 3/12/1981 7:25 1
A 5 3/12/1981 7:40 1
B 4 3/12/1981 7:40 1
A 7 8/29/1982 10:00 2
A 31 9/12/1982 9:50 3
C 30 9/12/1982 9:50 3
A 69 4/10/1985 13:37 4
Экземпляр, в этом случае, когда индивид А присутствует, наряду с любым другими индивидуальными, присутствующим в условное время и площади. Если A появляется отдельно без каких-либо соседей по площади и времени, он получает собственный экземпляр, как показано в примерах 2 и 4.
С точки зрения кода я счел более простым копировать дату-время возникновение отдельного А в колонку как таковое:
ind area time instance
B 5 3/12/1981 7:20 3/12/1981 7:40
D 6 3/12/1981 7:25 3/12/1981 7:40
A 5 3/12/1981 7:40 3/12/1981 7:40
B 4 3/12/1981 7:40 3/12/1981 7:40
A 7 8/29/1982 10:00 8/29/1982 10:00
A 31 9/12/1982 9:50 9/12/1982 9:50
C 30 9/12/1982 9:50 9/12/1982 9:50
A 69 4/10/1985 13:37 4/10/1985 13:37
Это также работает в моей конкретной ситуации. Я не могу понять это главным образом из-за отсутствия ловкости с синтаксисом, связанного с характером проблемы. С моей точки зрения, простой оператор ifelse
не будет работать, и я не уверен, как можно объединить его с sapply
.
Быстрое построение примера данных:
id<-c("B","D","A","B","A","A","C","A")
area<-c(5,6,5,4,7,31,30,69)
time<-as.POSIXct(c("3/12/1981 7:20","3/12/1981 7:25","3/12/1981 7:40","3/12/1981 7:40","8/29/1982 10:00","9/12/1982 9:50","9/12/1982 9:5
0","4/10/1985 13:37"),format="%m/%d/%Y %H:%M")
dat<-data.frame(id, area, time)
Моя попытка спустилась к этому, но он чувствовал себя неправильно с самого начала идти:
dat$instance <- with(dat, sapply(time[ind==A], function(x)
ifelse(abs(area- area[ind==A & time == x]) <=1 & abs(difftime(time, x, units = "mins")) <= 30, time[ind=A],NA)
)
)
Это попытка адаптировать коды при условии по Henrik, thelatemail и Justin для проблемы. У меня было несколько месяцев назад на основе аналогичной проблемы, но с подмножеством. Извините, если уже есть эквивалентная проблема. Мне не удалось найти то, что я мог бы интерпретировать.
Описание теперь понятно, спасибо), это интересный вопрос. Кстати, у вас есть некоторые очевидные ошибки в вашей попытке: в 'time [ind = A]' он должен быть двузначным знаком '==', а 'A' должен быть закодирован как' 'A '' везде, потому что это строковый объект. Я не думаю, что он исправляет все проблемы, хотя –