R等价于SAS认沽声明

时间:2019-03-19 23:46:11

标签: r dplyr sas

R 中是否与 SAS put语句等效,以通过将现有变量与列表匹配来创建新变量。 / p>

假设我要使用邮政编码列表和普查MSA。

有所有压缩列表和所有MSA的列表:

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

(以此类推,美国境内所有拉链)

我想匹配地址文件中的邮政编码,并创建MSA字段。在 SAS 中,我将运行:

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

哪个说“通过从工作文件中提取zip并匹配存储在库中的名为'$ zipmsa'的列表来创建hsmsaarea”。如果压缩的地址文件与库文件中的内容相匹配,则将MSA值放入工作文件中。

是否有类似的 R 函数,不是联接或合并?我可以作为独立生产线运行还是可以在 dplyr 链中运行?

2 个答案:

答案 0 :(得分:0)

我认为您可能需要以下一种:

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

答案 1 :(得分:0)

感谢Moody_Mudskipper的回答,这是完整的解决方案...

首先,我需要导入所有zip及其对应的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" 

我要在其中创建MSA值的表I:

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

比联接或合并更好?不知道,猜猜我可以进行测试。我要处理的数据集可能有成千上万甚至10万多个记录。在SAS中,我发现put语句比合并更有效率。