从数字范围中获取数字列表

时间:2017-08-01 10:18:48

标签: r list dataframe numbers range

我有一个数据框,其中一列包含一系列数字(或多个范围)。我想把它变成一个基于给定范围的数字列表。

示例输入:

"35-40"

"35-43, 45-47"

这应该产生:

[1]  35 36 37 38 39 40

[1]  35 36 37 38 39 40 41 42 43 45 46 47

3 个答案:

答案 0 :(得分:3)

我们可以进行拆分并使用Map获取数字

do.call(Map, c(`:`, lapply(strsplit(df1$v1, '-'), as.numeric)))
#[[1]]
# [1] 35 36 37 38 39 40 41 42 43 44 45

#[[2]]
#[1] 43 44 45 46 47

如果我们需要在字符串中找到序列

lapply(strsplit(df1$v1, "-"), function(x) Reduce(`:`, as.numeric(x)))
#[1]]
#[1] 35 36 37 38 39 40 41 42 43

#[[2]]
#[1] 45 46 47

更新

如果我们在字符串中有多个元素

df1 <- structure(list(v1 = c("35-43", "45-47", "30-42, 25-27")), 
.Names = "v1", row.names = c(NA, 
 -3L), class = "data.frame")

lapply(strsplit(df1$v1, ", "), function(x) do.call(c, 
    lapply(strsplit(x, "-"), function(y) Reduce(`:`, as.numeric(y)))))

数据

df1 <- structure(list(v1 = c("35-43", "45-47")), .Names = "v1", row.names = c(NA, 
-2L), class = "data.frame")

答案 1 :(得分:2)

您可以按照以下方式使用eval(parse(...))

eval(parse(text = sub('-', ':', '35-40')))
#[1] 35 36 37 38 39 40

unlist(lapply(sub('-', ':', c('35-40', '45-47')), function(i) eval(parse(text = i))))
#[1] 35 36 37 38 39 40 45 46 47

修改

根据您最新的编辑,

unlist(lapply(strsplit(x, ', '), function(i) {
           ind <- sub('-', ':', i); unlist(lapply(ind, function(j) eval(parse(text = j))))
  }))

 #[1] 35 36 37 38 39 40 41 42 43 45 46 47

答案 2 :(得分:1)

我们使用substr来提取字符串的一部分以获取数字列表的开头和结尾。我们使用as.numeric将提取的字符串转换为数字。我们使用冒号来创建数字列表。它也适用于列表的多个部分

git add