Как объединить два вектора разной длины в R
у меня есть набор измерений, выполняемых регулярно, но некоторые из них отсутствуют:
measurement_date value
1 2011-01-17 13:00:00 5
2 2011-01-17 13:04:00 5
3 2011-01-17 13:08:00 7
4 2011-01-17 13:12:00 8
5 2011-01-17 13:16:00 4
6 2011-01-17 13:24:00 6
7 2011-01-17 13:28:00 5
8 2011-01-17 13:32:00 6
9 2011-01-17 13:36:00 9
10 2011-01-17 13:40:00 8
11 2011-01-17 13:44:00 6
12 2011-01-17 13:48:00 6
13 2011-01-17 13:52:00 4
14 2011-01-17 13:56:00 6
у меня есть функция, которая будет обрабатывать значения и может обрабатывать отсутствующие значения, но строка должна быть там, поэтому я генерирую массив, который имеет строку для каждой минуты, как это:
times <- timeSequence(from=.., length=60, by="min")
Теперь у меня есть строка для каждой минуты часа, но мне нужно объединить данные. Я попробовал что-то вроде этого, но не смог сделать это правильно:
lapply(times, function(time) {
n <- as.numeric(time)
v <- Position(function(candidate) {
y <- as.numeric(candiated)
n == y
}
.. insert the value into the row here ..
}
но я только получаю ошибки и предупреждения. Правильно ли я обхожу проблему? Я действительно хочу" полный " массив со значениями в минуту, так как будет много разных функций, которые будут запускаться из показаний, и это просто упрощает их реализацию, если они могут предположить, что все это есть.
2 ответов
DF <- data.frame(measurement_date = seq(as.POSIXct("2011-01-17 13:00:00"),
as.POSIXct("2011-01-17 13:56:00"),
by = "mins")[seq(1, 57, by = 4)][-6],
value = c(5,5,7,8,4,6,5,6,9,8,6,6,4,6))
full <- data.frame(measurement_date = seq(as.POSIXct("2011-01-17 13:00:00"),
by = "mins", length = 60),
value = rep(NA, 60))
можно использовать два подхода, первый через merge
:
> v1 <- merge(full, DF, by.x = 1, by.y = 1, all = TRUE)[, c(1,3)]
> names(v1)[2] <- "value" ## I only reset this to pass all.equal later
> head(v1)
measurement_date value
1 2011-01-17 13:00:00 5
2 2011-01-17 13:01:00 NA
3 2011-01-17 13:02:00 NA
4 2011-01-17 13:03:00 NA
5 2011-01-17 13:04:00 5
6 2011-01-17 13:05:00 NA
второй - через переменную индикатора, полученную с помощью %in%
:
> want <- full$measurement_date %in% DF$measurement_date
> full[want, "value"] <- DF[, "value"]
> head(full)
measurement_date value
1 2011-01-17 13:00:00 5
2 2011-01-17 13:01:00 NA
3 2011-01-17 13:02:00 NA
4 2011-01-17 13:03:00 NA
5 2011-01-17 13:04:00 5
6 2011-01-17 13:05:00 NA
> all.equal(v1, full)
[1] TRUE
версия слияния сильно предпочтительно, но нуждается в небольшой работе. The %in%
решение работает только здесь, потому что данные в порядке времени в обоих DF
и full
, следовательно, мой предыдущий "предпочтительный". Однако легко получить / обеспечить два объекта в порядке времени, поэтому оба подхода требуется немного тонкости, чтобы работать. Мы можем изменить %in%
подход, чтобы получить обе переменные в порядке (начинаю заново с full
):
full2 <- data.frame(measurement_date = seq(as.POSIXct("2011-01-17 13:00:00"),
by = "mins", length = 60),
value = rep(NA, 60))
full2 <- full2[order(full2[,1]), ] ## get full2 in order
DF2 <- DF[order(DF[,1]), ] ## get DF in order
want <- full$measurement_date %in% DF$measurement_date
full2[want, "value"] <- DF2[, "value"]
> all.equal(full, full2)
[1] TRUE
> all.equal(full2, v1)
[1] TRUE
>
в вашей функции, as.числовой (candiated) должен быть как.числовой (кандидат). Также отсутствует скобка. Я понятия не имею, чего именно вы пытаетесь достичь в своей функции, но для меня это выглядит ужасно сложным.
попробовать
merge(Data,times,by.x=1,by.y=1,all.y=T)
Это должно дать вам что-то работать.