Создание «категориальной» переменной для подмножеств в цикле For - PullRequest
1 голос
/ 04 октября 2019

Я хочу поместить операцию в цикл for таким образом, чтобы она применялась к каждому подмножеству индивидуально.

Цель состоит в том, чтобы создать цикл for, который генерирует подмножество для переменной «State», а затем присваивает квантильные значения (1: 4 или 0-25%, 25% -50%, 50% -75%75% -100%) для каждой записи в каждом подмножестве. Это немного сложно объяснить, так что вот пример. Мои данные выглядят примерно так:


data <- data.frame(data)

State     Summer_Temperature
CA                        72
NY                        84
TX                        91
NY                        70
NY                        74
CA                        70
TX                        95
CA                        71
NY                        99
CA                        67
NY                        86
CA                        70
TX                        101
TX                        110
NY                        60
.                         .
.                         .
.                         .
.                         .

У меня начальный цикл for:

for (i in data$State) {
    state.US <- paste("state", i, sep = "_")
    assign(state.US, data[data$State == i,])
}

Это создает кадры данных для"state_CA", "state_NY" и "state_TX". Теперь я хочу создать новую переменную под названием «Квантиль» для каждого из этих подмножеств и назначить 1, 2, 3 или 4 для каждого наблюдения, основываясь на распределении температуры для данного состояния.

(Примечание: мне нужны квантили для каждого поднабора, а не для всего набора данных в целом.)


Я знаю, что могу сделать это вручную для каждого состояния с помощью кода:

state_CA$Quantile <- cut(state_CA$Summer_Temperature, breaks = quantile(state_CA$Summer_Temperature), labels = 1:4, include.lowest = TRUE)

Но я уверен, что есть более эффективный способ, чем повторять его для всех 50 состояний, и, возможно, я смогу добавить больше операций в цикл, как только найду способ сделать это.


Примерно так должен выглядеть результат:

State     Summer_Temperature           Quantile
CA                        72                  4
CA                        70                  2
CA                        67                  1
CA                        71                  3
CA                        70                  2
NY                        99                  4
NY                        86                  3
NY                        84                  3
NY                        70                  2
NY                        74                  2
NY                        60                  1
TX                        91                  1
TX                        95                  2
TX                        101                 3
TX                        110                 4
.                         .
.                         .
.                         .
.                         .

Этот вопрос преследует меня уже пару месяцев (различные проекты из школы и работы)и я почти закончил печатать повторяющийся код, когда я знаю, что есть лучший способ.

Мой доктор философии по R-программированию не смог предложить помощь, поэтому, если кто-нибудь сможет разъяснить мне это, я буду очень признателен.

Спасибо.

Редактировать: Я впервые на этой стороне переполнения стека, поэтому любые советы / критика приветствуются.

1 Ответ

0 голосов
/ 04 октября 2019

Нет необходимости разбивать наборы данных на разные кадры данных, а также использовать цикл for, вы можете выполнять расчеты по группам. Используя dplyr, это будет

library(dplyr)

data %>%
  group_by(State) %>%
  mutate(Quantile = cut(Summer_Temperature, breaks = quantile(Summer_Temperature), 
                    labels = 1:4, include.lowest = TRUE))

или в базе R с ave

data$Quantile <- with(data, ave(Summer_Temperature, State, FUN = function(x) 
           cut(x, breaks = quantile(x), labels = 1:4, include.lowest = TRUE)))
...