2015-09-24 3 views
2

У меня есть эта структура данных ниже и вам нужно создать столбец на основе ассоциаций с элементом 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 для проблемы. У меня было несколько месяцев назад на основе аналогичной проблемы, но с подмножеством. Извините, если уже есть эквивалентная проблема. Мне не удалось найти то, что я мог бы интерпретировать.

+1

Описание теперь понятно, спасибо), это интересный вопрос. Кстати, у вас есть некоторые очевидные ошибки в вашей попытке: в 'time [ind = A]' он должен быть двузначным знаком '==', а 'A' ​​должен быть закодирован как' 'A '' везде, потому что это строковый объект. Я не думаю, что он исправляет все проблемы, хотя –

ответ

0

Возможно, это:

instance <- as.data.frame(with(dat, sapply(time[id=="A"], function(x) 
ifelse(abs(area- area[id=="A" & time == x]) <=1 & abs(difftime(time, x, units = "mins")) <= 30, x,NA)))) 

datinstance=cbind(dat,instance) 
melt(datinstance, id.vars=c("id","time","area"),na.rm=T) 

Процедура расплав может позаботиться о возможных дубликатах А в течение времени/площадь реквизитов.

 Смежные вопросы

  • Нет связанных вопросов^_^