如何将SAS数值格式目录导入R并基于起止变量生成新序列变量
把SAS数值格式目录导入R的解决方案
需要将SAS中按起始值-结束值组织的数值格式目录导入R,要求起止值之间的所有整数都映射到对应的目标值(可数字或字符),同时避免填充区间之间的空白数值(比如示例中10-13和15-15之间的14)。
示例数据集
fname <- c("aformat", "aformat", "aformat", "aformat", "aformat") svalue <- c(1, 10, 15, 16, 30) evalue <- c(2, 13, 15, 16, 35) gvalue <- c("Berne", "Lucerne", "Zurich", "Chur", "Basel") df <- data.frame(fname, svalue, evalue, gvalue)
失败的尝试(会填充区间间隙)
output <- df %>% group_by(fname) %>% complete(evalue = full_seq(min(svalue):max(evalue), 1)) %>% select(fname, evalue, gvalue) %>% fill(gvalue, .direction = "up")
正确解决方案
使用purrr::map2为每行的起止值生成对应的整数序列,再通过unnest展开,这样只会保留各区间内的数值,不会生成区间外的空白值:
library(dplyr) library(tidyr) library(purrr) output <- df %>% group_by(fname) %>% # 为每行生成svalue到evalue的整数序列 mutate(value = map2(svalue, evalue, seq)) %>% # 展开序列列 unnest(value) %>% # 整理输出列 select(fname, value, gvalue)
结果说明
运行后得到的output会包含以下对应关系:
- 1、2 → Berne
- 10、11、12、13 → Lucerne
- 15 → Zurich
- 16 → Chur
- 30、31、32、33、34、35 → Basel
完全匹配SAS格式的映射规则,且不会出现14这类区间外的数值。
内容的提问来源于stack exchange,提问作者R_Vo
相关产品推荐
相关产品推荐

