#r
#r
Вопрос:
У меня есть вектор, представляющий собой список бразильских штатов, и я хочу сформировать data.frame, который сообщает, какой штат расположен в каком регионе.
Данные для фрейма данных будут импортированы с веб-сайта, на котором не обязательно перечислены все состояния, поэтому ему придется выбирать одно состояние за другим, и он будет настроен на свой собственный регион.
Тогда у меня есть 5 разных региональных векторов со своими собственными состояниями.
states <- c("AC", "AL", "AM", "AP", "BA", "CE", "DF", "ES", "GO", "MA", "MG", "MS", "MT", "PA", "PB", "PE", "PI", "PR", "RJ", "RN", "RO", "RR", "RS", "SC", "SE", "SP", "TO")
no <- c("AC","AP","AM","PA","RO","RR","TO")
su <- c("PR","SC","RS")
co <- c("GO","MG","MS","DF")
ne <- c("AL","BA","CE","MA","PB","PE","PI","RN","SE")
mges <- c("MG","ES")
rj <- c("RJ")
sp <- c("SP")
Мне нужна программа, которая зацикливает вектор «состояний» с веб-сайта для формирования фрейма данных со столбцами: «СОСТОЯНИЕ», «РЕГИОН».
Самая сложная часть — выбрать конкретные данные из вектора для формирования нового, существующего из region, поскольку я импортирую данные, которые на самом деле не имеют всех состояний.
Ответ №1:
Я рекомендую хранить информацию о регионе в списке. Этот список можно использовать для создания фрейма данных.
regions <- list(no = c("AC","AP","AM","PA","RO","RR","TO"),
su = c("PR","SC","RS"),
co = c("GO","MG","MS","DF"),
ne = c("AL","BA","CE","MA","PB","PE","PI","RN","SE"),
mges = c("MG","ES"),
rj = c("RJ"),
sp = c("SP"))
region_dat <- data.frame(state = unlist(regions),
region = rep(names(regions), lengths(regions)))
Теперь вы можете объединить states
данные и фрейм данных, содержащий информацию о регионе:
merge(data.frame(state = states), region_dat)
Результат:
state region
1 AC no
2 AL ne
3 AM no
4 AP no
5 BA ne
6 CE ne
7 DF co
8 ES mges
9 GO co
10 MA ne
11 MG co
12 MG mges
13 MS co
14 PA no
15 PB ne
16 PE ne
17 PI ne
18 PR su
19 RJ rj
20 RN ne
21 RO no
22 RR no
23 RS su
24 SC su
25 SE ne
26 SP sp
27 TO no
Комментарии:
1. Этот код сработал отлично! Большое вам спасибо @Sven Hohenstein!!
Ответ №2:
Если вы можете немного реструктурировать свои данные, вот tidyverse
способ сделать то, что вы хотите сделать.
library(tidyverse)
df1 = data.frame(states = c("AC","AP","AM","PA","RO","RR","TO"), region='no')
df2 = data.frame(states = c("PR","SC","RS"), region='su')
df3 = data.frame(states = c("GO","MG","MS","DF"), region='co')
df4 = data.frame(states = c("AL","BA","CE","MA","PB","PE","PI","RN","SE"), region='ne')
df5 = data.frame(states = c("MG","ES"), region='mges')
df6 = data.frame(states = c("RJ"), region='rj')
df7 = data.frame(states = c("SP"), region='sp')
dfs = list(df1,df2,df3,df4,df5,df6,df7)
state_regions = bind_rows(dfs)
Для каждого региона создайте фрейм данных с соответствующими состояниями. Затем объедините все строки фрейма данных.
states region
1 AC no
2 AP no
3 AM no
4 PA no
5 RO no
6 RR no
7 TO no
8 PR su
9 SC su
10 RS su
11 GO co
12 MG co
13 MS co
14 DF co
15 AL ne
16 BA ne
17 CE ne
18 MA ne
19 PB ne
20 PE ne
21 PI ne
22 RN ne
23 SE ne
24 MG mges
25 ES mges
26 RJ rj
27 SP sp