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 链中运行?
答案 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语句比合并更有效率。