R эквивалент SAS положить заявление - PullRequest
0 голосов
/ 20 марта 2019

Существует ли в R эквивалент оператора SAS put с целью создания новой переменной путем сопоставления существующей переменной со списком.

Допустим, я хотел использовать список почтовых индексов и переписных MSAs.

Есть список всех почтовых индексов и всех MSA:

zip       censusmsa
94114     "San Francisco-Oakland, CA"
...

(и так далее, все почтовые индексы в США)

Я хочу сопоставить почтовый индекс из файла адреса и создать поле MSA. В SAS я бы запустил:

hsmsaarea=(put(hszip_use,$zipmsa.));

В котором говорится "создайте hsmsaarea, взяв zip из рабочего файла и сопоставив его со списком $ zipmsa, хранящимся в библиотеке". Если zip в файле адреса совпадает с чем-то в файле библиотеки, поместите значение MSA в рабочий файл.

Существует ли подобная функция R , которая не является объединением или слиянием? Что-то, что я могу запустить как отдельную линию или в идеале в цепочке dplyr ?

Ответы [ 2 ]

0 голосов
/ 23 марта 2019

Спасибо Moody_Mudskipper за ответ, вот полное решение ...

Сначала мне нужно было импортировать список всех почтовых индексов и соответствующих им MSA;

zipmsa_mine <- read.table(file="C:/Data/ziptomsa.txt", header = TRUE, StringsAsFactors = FALSE, colClasses = c('character', 'character'))
head(zipmsa_mine)
    zip                            msa
1 00210 Boston-Cambridge-Quincy, MA-NH
2 00211 Boston-Cambridge-Quincy, MA-NH
3 00212 Boston-Cambridge-Quincy, MA-NH

Затем я превратил полученную таблицу в именованный список:

zipmsa_mine_l <- structure(as.character(zipmsa_mine$zip), names = as.character(zipmsa_mine$msa))

 #head(zipmsa_mine_l)
#Boston-Cambridge-Quincy, MA-NH Boston-Cambridge-Quincy, MA-NH 
#                       "00210"                        "00211" 
#Boston-Cambridge-Quincy, MA-NH Boston-Cambridge-Quincy, MA-NH 
#                       "00212"                        "00213" 
#Boston-Cambridge-Quincy, MA-NH Boston-Cambridge-Quincy, MA-NH 
#                       "00214" 

Таблица I, в которой я хочу создать значение MSA:

df <- read.table(h= T, strin = F, text = 'zip       college
                 "94132"     "SFSU"
                 "19104"     "UPenn")

И, матч:

df$MSA4 <- names(zipmsa_mine_l[match(df$zip, zipmsa_mine_l)])

Который получает;

  #zip college                           MSA
#1 94132    SFSU           San Francisco-Oakland-Fremont, CA
#2 19104  UPenn Philadelphia-Camden-Wilmington, PA-NJ-DE-MD

Лучше, чем объединение или слияние? Не уверен, думаю, я мог бы провести тест. Наборы данных, над которыми я буду работать, могут содержать десятки тысяч или даже более 100 тысяч записей. И в SAS я обнаружил, что выражение put немного более эффективно, чем слияние.

0 голосов
/ 20 марта 2019

Я думаю, вам может понадобиться одно из следующих:

df <- read.table(h= T, strin = F, text = 'zip       censusmsa
                 94114     "San Francisco-Oakland, CA"
                 12345     "foo"')

zipmsa <- c(`94114` = "bar", `12345` = "baz", `54321` = "qux")
df$MSA <- zipmsa[as.character(df$zip)]
df
#     zip                 censusmsa MSA
# 1 94114 San Francisco-Oakland, CA bar
# 2 12345                       foo baz

zipmsa <- c(baz = 12345, bar = 94114, qux = 54321)
df$MSA <- names(zipmsa[match(df$zip, zipmsa)])
df
#     zip                 censusmsa MSA
# 1 94114 San Francisco-Oakland, CA bar
# 2 12345                       foo baz

Если вы начинаете с именованного list, а не с именованного вектора, используйте unlist на нем.

...