Как мне объединить два вектора разной длины в R - PullRequest
6 голосов
/ 18 января 2011

У меня есть регулярные измерения, но некоторые отсутствуют:

      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 ]

8 голосов
/ 18 января 2011
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

Версия слияния настоятельно предпочтительна, но требует небольшой работы. Решение %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
>
6 голосов
/ 18 января 2011

В вашей функции as.numeric (кандидат) должен быть as.numeric (кандидат). Там также отсутствует скобка. Я понятия не имею, чего именно вы пытаетесь достичь в своей функции, но мне это кажется ужасно сложным.

Попробуйте

merge(Data,times,by.x=1,by.y=1,all.y=T)

Это должно дать вам кое-что для работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...