Ищите помощь для написания сложного фрагмента кода R.Найти и сопоставить ближайшее значение строки на основе критерия
У меня есть кадр данных следующей структуры:
#make fake data
category<-c("a", "a", "a", "a", "a", "b", "b", "b", "b", "b")
cat.id<-rep(1:5, 2)
time <- seq.POSIXt(as.POSIXct("10/24/16 21:05", format="%m/%d/%y %H:%M", tz="America/Chicago"), by="5 min", length.out=10)
x<-c(0.2, 3, 4, 0.5, 1.4, 3, 1.9, 2.2, 4, 1.2)
data<-data.frame(category, cat.id, time, x)
>data
category cat.id time x
1 a 1 2016-10-24 21:05:00 0.2
2 a 2 2016-10-24 21:10:00 3.0
3 a 3 2016-10-24 21:15:00 4.0
4 a 4 2016-10-24 21:20:00 0.5
5 a 5 2016-10-24 21:25:00 1.4
6 b 1 2016-10-24 21:30:00 3.0
7 b 2 2016-10-24 21:35:00 1.9
8 b 3 2016-10-24 21:40:00 2.2
9 b 4 2016-10-24 21:45:00 4.0
10 b 5 2016-10-24 21:50:00 1.2
Для каждого подмножества «категории» (например, «а» или «б»), мне нужно перенести «cat.id», такие что: -if «x» равно < 2, тогда «cat.id» сопоставляется (или сдвигается) до ближайшего предыдущего значения «cat.id», где x is> = 2. -сдвинутый «cat.id» «значение сохраняется в столбце« cat.idshifted » -Для значений« cat.id »== 1 сдвиг отсутствует, поскольку для этого подмножества« категории »нет предшествующего значения
Это будет производить кадр данных, как:
data$cat.idshifted<-c(1, 2, 3, 3, 3, 1, 1, 3, 4, 4)
>data
category cat.id time x cat.idshifted
1 a 1 2016-10-24 21:05:00 0.2 1
2 a 2 2016-10-24 21:10:00 3.0 2
3 a 3 2016-10-24 21:15:00 4.0 3
4 a 4 2016-10-24 21:20:00 0.5 3
5 a 5 2016-10-24 21:25:00 1.4 3
6 b 1 2016-10-24 21:30:00 3.0 1
7 b 2 2016-10-24 21:35:00 1.9 1
8 b 3 2016-10-24 21:40:00 2.2 3
9 b 4 2016-10-24 21:45:00 4.0 4
10 b 5 2016-10-24 21:50:00 1.2 4
Основная идея заключается в том, что «cat.id» представляет количество собранных файлов данных для «категории». Иногда файлы данных, которые фактически принадлежат одному событию, разбиваются на несколько файлов из-за проблем с оборудованием. Таким образом, 1 событие данных может быть собрано в 3 файла. Вы можете выяснить, какие файлы идут вместе, глядя на «x». Если значение x < 2, то файлы идут вместе. И так как 1 файл можно разбить на многие, последовательность x < 2 будет представлять несколько файлов, которые принадлежат друг другу.
Так что я хочу сделать, это индекс/найти каждый раз, когда x < 2, и отрегулируйте «cat.id» или идентификатор файла до правильного значения, которое происходит, когда ближайший по времени предыдущий файл с x> = 2.
Я думаю, что функция, которая индексирует ближайшее (по времени)> = 2 значение «x», может быть уместным. Затем индексированное значение вернет значение «cat.id» в значение «cat.idshifted».
Я знаком с which.max и т. Д., Чтобы индексировать значения, однако я не знаю, как индексировать значения, говоря «дайте мне то, что является самым близким предыдущим значением».
Я не включал здесь для простоты, но x на самом деле представляет собой количество времени между каждой коллекцией файлов. Например, это сложный объект. Может быть, цикл while может работать? Где: -когда есть х < 2 значения -Shift значение cat.id назад 1 (например, cat.id-1) -Recompute difftime -Check если есть еще значения х < 2, не повторяется, если до тех пор не правда.
Любые мысли об этой сложной части кода?
хорошо поймать и острый глаз! отредактирован для исправления. – griffmer
Не может ответить на вопрос, но для «дайте мне то, что является ближайшим предыдущим значением», это будет работать: 'y <-5.4 x <-rnorm (10,6,1) x [x <= y] [which.min (abs (x [x <= y] - y))] ' – Jean