Суммируйте переменную на основе другой переменной - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть набор данных, состоящий из двух переменных, Contents и Time, например:

Time          Contents
2017M01       123
2017M02       456
2017M03       789
.             .
.             .
.             .
2018M12       789

Теперь я хочу создать числовой вектор, который агрегирует Contents за шесть месяцев, то естьЯ хочу суммировать 2017M01 до 2017M06 до одного числа, 2017M07 до 2017M12 до другого числа и т. Д.

Я могу сделать это путем индексации, но хочу, чтобы я могнаписать: «С 2017M01 по 2017M06 сумма содержимого, соответствующего этой последовательности» в моем коде.

Я был бы очень признателен за помощь!

1 Ответ

0 голосов
/ 27 февраля 2019

Вы можете создать переменную группировки на основе количества строк и количества элементов для группировки.В вашем случае вы хотите сгруппировать каждые 6 строк, чтобы ваш фрейм данных делился на 6. Использование демонстрации iris (в ней 150 строк, поэтому 150/6 = 25)

rep(seq(nrow(iris)%/%6), each = 6)
  #[1]  1  1  1  1  1  1  2  2  2  2  2  2  3  3  3  3  3  3  4  4  4  4  4  4  5  5  5  5  5  5  6  6  6  6  6  6  7  7  7  7  7  7  8  8  8  8  8  8  9  9  9  9  9  9 10 10 10 10
 #[59] 10 10 11 11 11 11 11 11 12 12 12 12 12 12 13 13 13 13 13 13 14 14 14 14 14 14 15 15 15 15 15 15 16 16 16 16 16 16 17 17 17 17 17 17 18 18 18 18 18 18 19 19 19 19 19 19 20 20
#[117] 20 20 20 20 21 21 21 21 21 21 22 22 22 22 22 22 23 23 23 23 23 23 24 24 24 24 24 24 25 25 25 25 25 25

ТамЕсть много способов справиться с тем, как вы хотите это назвать.Вот пользовательская функция, которая позволяет вам сделать это (т.е. создать переменную группировки),

f1 <- function(x, df) {
    v1 <- as.numeric(gsub('[0-9]{4}M(.*):[0-9]{4}M(.*)$', '\\1', x))
    v2 <- as.numeric(gsub('[0-9]{4}M(.*):[0-9]{4}M(.*)$', '\\2', x))
    i1 <- (v2 - v1) + 1
    return(rep(seq(nrow(df)%/%i1), each = i1))
}

f1("2017M01:2017M06", iris)
  #[1]  1  1  1  1  1  1  2  2  2  2  2  2  3  3  3  3  3  3  4  4  4  4  4  4  5  5  5  5  5  5  6  6  6  6  6  6  7  7  7  7  7  7  8  8  8  8  8  8  9  9  9  9  9  9 10 10 10 10
 #[59] 10 10 11 11 11 11 11 11 12 12 12 12 12 12 13 13 13 13 13 13 14 14 14 14 14 14 15 15 15 15 15 15 16 16 16 16 16 16 17 17 17 17 17 17 18 18 18 18 18 18 19 19 19 19 19 19 20 20
#[117] 20 20 20 20 21 21 21 21 21 21 22 22 22 22 22 22 23 23 23 23 23 23 24 24 24 24 24 24 25 25 25 25 25 25

РЕДАКТИРОВАТЬ: Мы можем легко сделать функцию совместимой с 'не-0-остатокделение путем объединения конечного результата с повторением значения max+1 конечного результата остаток раз, т. е.

f1 <- function(x, df) {
    v1 <- as.numeric(gsub('[0-9]{4}M(.*):[0-9]{4}M(.*)$', '\\1', x))
    v2 <- as.numeric(gsub('[0-9]{4}M(.*):[0-9]{4}M(.*)$', '\\2', x))
    i1 <- (v2 - v1) + 1
    final_v <- rep(seq(nrow(df) %/% i1), each = i1)
    if (nrow(df) %% i1 == 0) {
        return(final_v)
    } else {
        remainder = nrow(df) %% i1
        final_v1 <- c(final_v, rep((max(final_v) + 1), remainder))
        return(final_v1)
    }
}

То есть для кадра данных с 20 строками, делаягруппы по 6, приведенная выше функция даст результат:

f1("2017M01:2017M06", df)
#[1] 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...