Обычно я справлялся бы с такой проблемой, выполняя цикл (вероятно, не самое лучшее решение до сих пор), но я работаю с очень большим набором данных (7,8 миллиона наблюдений), и я пытался программировать его более эффективно.Вот очень небольшое подмножество моего набора данных:
df = data.frame(STATE = c("PA", "PA", "MD","MD", "MO", "MO"),
DIVISION = c("Middle_Atlantic", "Middle_Atlantic","South_Atlantic","South_Atlantic","West_North_Central","West_North_Central"),
Middle_Atlantic_NSA = c(117.77, 119.43, 119.43, 120.72, 119.11, 117.77),
Middle_Atlantic_SA = c(118.45, 119.65, 119.65, 120.73, 119, 118.45),
South_Atlantic_NSA = c(134.45, 135.2, 135.2, 136.69, 134.07, 134.45),
South_Atlantic_SA = c(134.25, 134.83, 134.83, 135.97, 133.86, 134.25),
West_North_Central_NSA=c(152.24, 153.61, 153.61, 155.19, 151.08, 152.24),
West_North_Central_SA=c(152.77, 153.19, 153.19, 154.44, 151.63, 152.77),
DIV_HPI_NSA = c(117.77, 119.43, 135.2, 136.69, 151.08, 152.24),
DIV_HPI_SA = c(118.45, 119.65, 134.83, 135.97, 151.63, 152.77))
Я включил желаемый вывод для переменных «DIV_HPI_NSA» и «DIV_HPI_SA».Я пытаюсь выполнить поиск значения в «DIVISION» (например, «Middle_Atlantic»), прикрепив к нему суффикс «_NDA», и вернуть соответствующее значение этой переменной (в данном случае «Middle_Atlantic») в новую переменную ».DIV_HPI_NSA».Я делаю то же самое для переменной "DIV_HPI_SA".В настоящее время я пытаюсь использовать либо функцию get (), либо метод eval (parse (text = "text_here")) для оценки строк как имен столбцов и получения правильных значений, однако они не работают так, как мне нужно.В идеале я бы предпочел решение dplyr, поскольку оно обрабатывалось относительно быстро, в отличие от циклов.Я не уверен, почему это не работает в dplyr, и хотел бы понять, почему и как я мог выполнить это успешно.Вот скриншот согласованного с цветом желаемого результата.
Вот мой текущий код:
comb.df = df %>%
mutate(DIV_HPI_NSA = get(paste0(DIVISION,"_NSA")),
DIV_HPI_SA = eval(parse(text = (paste0(DIVISION,"_SA")))))
Вот какЯ бы сделал это через цикл - который дает правильный результат, но это занимает смехотворное количество времени:
for(i in 1:dim(comb.df)[1]){
comb.df$DIV_HPI_NSA[i] = comb.df[i, paste0(comb.df$DIVISION[i],"_NSA")]
comb.df$DIV_HPI_SA[i] = comb.df[i, paste0(comb.df$DIVISION[i],"_SA")]
}
Мой текущий вывод (т.е. DIV_HPI_NSA) продолжает обеспечивать вывод столбца, который соответствует первому оцениваемому элементув колонке "ОТДЕЛЕНИЕ".Например, метод dplyr для «DIV_HPI_NSA» возвращает только значения из столбца «Middle_Atlantic_NSA», поскольку это первый элемент в «DIVISION».Eval () также имеет ту же проблему и не генерирует правильный вывод строк.
Есть ли лучший / более быстрый метод, чем dplyr, и / или как я могу исправить свой код dplyr, чтобы он работал правильно?
Пожалуйста, дайте мне знать, если вам может понадобиться дополнительная информация.
Заранее спасибо!