如何从data.frame的first和last列生成目标数值数组?
问题:从data.frame的两列生成连续数值数组
我需要从data.frame的first和last两列生成包含所有连续区间的数值数组,目前通过paste0(first,':',last)生成了range列,得到了类似目标数组的字符串形式,但这个字符串无法被识别为数值数组,求解决办法。
示例数据
data <- structure(list(first = c(22, 26, 29, 32, 36, 39, 43, 47), last = c(24, 27, 30, 34, 37, 41, 45, 49), range = c("22:24", "26:27", "29:30", "32:34", "36:37", "39:41", "43:45", "47:49")), row.names = c(NA, -8L), class = "data.frame")
当前做法与问题
我尝试用拼接字符串的方式生成表达式:
paste0('c(',paste(data$range,collapse=','),')')
得到的输出是字符串:
[1] "c(22:24,26:27,29:30,32:34,36:37,39:41,43:45,47:49)"
但这个字符串无法直接转化为数值数组,达不到预期效果。
期望输出
想要得到的是展开后的连续数值数组:
c(22:24,26:27,29:30,32:34,36:37,39:41,43:45,47:49) # [1] 22 23 24 26 27 29 30 32 33 34 36 37 39 40 41 43 44 45 47 48 49
解决方案
方法1:用mapply直接生成区间并合并
不需要生成range列,直接对first和last列逐行生成连续序列,再合并成一个向量:
unlist(mapply(function(x, y) x:y, data$first, data$last))
方法2:用purrr包的map2(适合tidyverse风格)
如果习惯用tidyverse工具,可以用map2生成每个区间,再展平为数值向量:
library(purrr) flatten_dbl(map2(data$first, data$last, `:`))
不推荐的方法:解析字符串(存在安全风险)
如果非要基于你生成的字符串来处理,可以用eval(parse(...)),但这种方法在处理未知数据时可能有安全隐患,不建议使用:
eval(parse(text = paste0('c(',paste(data$range,collapse=','),')')))
内容的提问来源于stack exchange,提问作者wernor
相关产品推荐
相关产品推荐

