【问题标题】:Extract the breakpoints from cut [duplicate]从cut中提取断点[重复]
【发布时间】:2016-04-12 18:16:07
【问题描述】:

cut 函数的文档给出了“一种提取断点的方法”

aaa <- c(1,2,3,4,5,2,3,4,5,6,7)
labs <- levels(cut(aaa, 3))
cbind(lower = as.numeric( sub("\\((.+),.*", "\\1", labs) ),
      upper = as.numeric( sub("[^,]*,([^]]*)\\]", "\\1", labs) ))

#      lower upper
# [1,] 0.994  3.00
# [2,] 3.000  5.00
# [3,] 5.000  7.01

是否有另一种内置方法来提取断点?

【问题讨论】:

  • 你可以稍微简化一下正则表达式:as.numeric(sub('.(.+),.+', '\\1', labs)); as.numeric(sub('.+,(.+).', '\\1', labs))

标签: r


【解决方案1】:

1) read.table 我不认为有任何直接用于此目的,但它更短:

read.table(text = gsub("[^.0-9]", " ", labs), col.names = c("lower", "upper"))

给出这个data.frame:

  lower upper
1 0.994  3.00
2 3.000  5.00
3 5.000  7.01

2) gsubfn::strapply 这是另一种可能性:

library(gsubfn)

strapply(labs, "[.0-9]+", as.numeric, simplify = rbind)

给出这个矩阵:

      [,1] [,2]
[1,] 0.994 3.00
[2,] 3.000 5.00
[3,] 5.000 7.01

3) gsubfn::read.pattern 和另一个:

library(gsubfn)

read.pattern(text = labs, pattern = ".(.+),(.+).", col.names = c("lower", "upper"))

给予:

  lower upper
1 0.994  3.00
2 3.000  5.00
3 5.000  7.01

【讨论】:

  • 不错的答案。如果有人的数字很大,它会使用科学记数法,e 会搞砸格式......所以请改用这个正则表达式:gsub(pattern = "[\\]\\(),]",replacement = " ", x = labs,perl = TRUE) 选项 1 使用 read.table
  • 如果断点中有负数,建议使用gsub("[^.0-9%-]", " ", labs) 而不是gsub("[^.0-9]", " ", labs) 这样负号将被保留。我意识到原始代码很难将负断点变成正断点......
【解决方案2】:

这是strsplit()的解决方案:

sapply(strsplit(labs, "\\(|,|]"), function(x) as.numeric(x[-1]))
#       [,1] [,2] [,3]
# [1,] 0.994    3 5.00
# [2,] 3.000    5 7.01

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 2020-05-05
    • 2017-06-25
    • 2017-05-24
    • 2021-06-13
    • 1970-01-01
    • 2011-06-09
    • 2020-12-17
    相关资源
    最近更新 更多