Как удалить частичные дубликаты из фрейма данных?
Данные, которые я импортирую, описывают числовые измерения, выполненные в разных местах для более или менее равномерно распределенных временных меток. иногда это "равномерно распространенное" на самом деле не так, и я должен отбросить некоторые из значений, это не важно, какой из них, если у меня есть одно значение для каждой метки времени для каждого местоположения.
что я делаю с данными? Я добавляю его в файл result
data.frame. Там я столбец timestamp
и значения в столбце timestamp, они определенно равномерно распределены в соответствии с step
.
timestamps <- ceiling(as.numeric((timestamps-epoch)*24*60/step))*step*60 + epoch
result[result$timestamp %in% timestamps, columnName] <- values
Это НЕ работает, когда у меня есть отметки времени, которые попадают на тот же промежуток времени. Это пример:
> data.frame(ts=timestamps, v=values)
ts v
1 2009-09-30 10:00:00 -2.081609
2 2009-09-30 10:04:18 -2.079778
3 2009-09-30 10:07:47 -2.113531
4 2009-09-30 10:09:01 -2.124716
5 2009-09-30 10:15:00 -2.102117
6 2009-09-30 10:27:56 -2.093542
7 2009-09-30 10:30:00 -2.092626
8 2009-09-30 10:45:00 -2.086339
9 2009-09-30 11:00:00 -2.080144
> data.frame(ts=ceiling(as.numeric((timestamps-epoch)*24*60/step))*step*60+epoch,
+ v=values)
ts v
1 2009-09-30 10:00:00 -2.081609
2 2009-09-30 10:15:00 -2.079778
3 2009-09-30 10:15:00 -2.113531
4 2009-09-30 10:15:00 -2.124716
5 2009-09-30 10:15:00 -2.102117
6 2009-09-30 10:30:00 -2.093542
7 2009-09-30 10:30:00 -2.092626
8 2009-09-30 10:45:00 -2.086339
9 2009-09-30 11:00:00 -2.080144
в Python я бы (неправильно) использовал словарь для достижения того, что мне нужно:
dict(zip(timestamps, values)).items()
возвращает список пар, где первая координата уникальна.
в R Я не знаю, как это сделать компактным и эффективным способом.
Ответы
Ответ 1
Я бы использовал subset
в сочетании с duplicated
для фильтрации неистинных временных меток во втором кадре данных:
R> df_ <- read.table(textConnection('
ts v
1 "2009-09-30 10:00:00" -2.081609
2 "2009-09-30 10:15:00" -2.079778
3 "2009-09-30 10:15:00" -2.113531
4 "2009-09-30 10:15:00" -2.124716
5 "2009-09-30 10:15:00" -2.102117
6 "2009-09-30 10:30:00" -2.093542
7 "2009-09-30 10:30:00" -2.092626
8 "2009-09-30 10:45:00" -2.086339
9 "2009-09-30 11:00:00" -2.080144
'), as.is=TRUE, header=TRUE)
R> subset(df_, !duplicated(ts))
ts v
1 2009-09-30 10:00:00 -2.082
2 2009-09-30 10:15:00 -2.080
6 2009-09-30 10:30:00 -2.094
8 2009-09-30 10:45:00 -2.086
9 2009-09-30 11:00:00 -2.080
Обновление:. Чтобы выбрать конкретное значение, вы можете использовать aggregate
aggregate(df_$v, by=list(df_$ts), function(x) x[1]) # first value
aggregate(df_$v, by=list(df_$ts), function(x) tail(x, n=1)) # last value
aggregate(df_$v, by=list(df_$ts), function(x) max(x)) # max value
Ответ 2
Я думаю, вы смотрите на структуры данных для объектов с индексом времени, а не для словаря. Для первого взгляните на zoo и xts пакеты, которые предлагают гораздо более удобное подмножество:
R> library(xts)
R> X <- xts(data.frame(val=rnorm(10)), \
order.by=Sys.time() + sort(runif(10,10,300)))
R> X
val
2009-11-20 07:06:17 -1.5564
2009-11-20 07:06:40 -0.2960
2009-11-20 07:07:50 -0.4123
2009-11-20 07:08:18 -1.5574
2009-11-20 07:08:45 -1.8846
2009-11-20 07:09:47 0.4550
2009-11-20 07:09:57 0.9598
2009-11-20 07:10:11 1.0018
2009-11-20 07:10:12 1.0747
2009-11-20 07:10:58 0.7062
R> X["2009-11-20 07:08::2009-11-20 07:09"]
val
2009-11-20 07:08:18 -1.5574
2009-11-20 07:08:45 -1.8846
2009-11-20 07:09:47 0.4550
2009-11-20 07:09:57 0.9598
R>
Объект X
упорядочен по времени - убедитесь, что он имеет тип POSIXct, поэтому вам может понадобиться сначала проанализировать ваши даты. Затем мы можем просто индексировать "7:08 до 7:09 в день подачи".