Как я могу построить новый вектор с конкретными данными из двух других векторов разного размера, используя R

#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