如何解析一系列数字?

huangapple go评论99阅读模式
英文:

How to parse a range of numbers?

问题

Sure, here's the translated code part:

  1. 我有一些数据看起来像这样:
  2. > dput(range)
  3. structure(list(Range = c("0T-1T", "2T-5T")), class = "data.frame", row.names = c(NA,
  4. -2L))
  5. 基本上,我想知道是否可以解析这些值,以便最终的数据框看起来像这样:
  6. > dput(range2)
  7. structure(list(Range = c("0T", "1T", "2T", "3T", "4T", "5T")), class = "data.frame", row.names = c(NA,
  8. -6L))
英文:

I have some data that looks like this:

  1. > dput(range)
  2. structure(list(Range = c("0T-1T", "2T-5T")), class = "data.frame", row.names = c(NA,
  3. -2L))

Basically, I am wondering if it is possible to parse these values out, so that the final dataframe looks like this:

  1. > dput(range2)
  2. structure(list(Range = c("0T", "1T", "2T", "3T", "4T", "5T")), class = "data.frame", row.names = c(NA,
  3. -6L))

答案1

得分: 1

A tidyverse solution with tidyr::separate_longer_delim() + tidyr::full_seq():

  1. library(tidyverse)
  2. range %>%
  3. group_by(grp = Range) %>%
  4. separate_longer_delim(Range, '-') %>%
  5. reframe(Range = paste0(full_seq(parse_number(Range), 1), 'T')) %>%
  6. select(-grp)

# A tibble: 6 × 1

Range

1 0T

2 1T

3 2T

4 3T

5 4T

6 5T

  1. <details>
  2. <summary>英文:</summary>
  3. A `tidyverse` solution with `tidyr::separate_longer_delim()` + `tidyr::full_seq()`:
  4. ```r
  5. library(tidyverse)
  6. range %&gt;%
  7. group_by(grp = Range) %&gt;%
  8. separate_longer_delim(Range, &#39;-&#39;) %&gt;%
  9. reframe(Range = paste0(full_seq(parse_number(Range), 1), &#39;T&#39;)) %&gt;%
  10. select(-grp)
  11. # # A tibble: 6 &#215; 1
  12. # Range
  13. # &lt;chr&gt;
  14. # 1 0T
  15. # 2 1T
  16. # 3 2T
  17. # 4 3T
  18. # 5 4T
  19. # 6 5T

答案2

得分: 0

可能有更简洁的方法,但这是一种方法:

  1. library(dplyr, warn.conflicts = F)
  2. library(stringr)
  3. library(tidyr)
  4. library(purrr)
  5. structure(list(Range = c("0T-1T", "2T-5T")), class = "data.frame", row.names = c(NA, -2L)) %>%
  6. mutate(
  7. Range = str_split(Range, '-'),
  8. Range = map(Range, str_remove, 'T'),
  9. Range = map(Range, as.integer),
  10. Range = map(Range, ~ paste0('T', seq(.x[1], .x[2], 1)))
  11. ) %>%
  12. unnest(Range)
  13. #> # A tibble: 6 × 1
  14. #> Range
  15. #> <chr>
  16. #> 1 T0
  17. #> 2 T1
  18. #> 3 T2
  19. #> 4 T3
  20. #> 5 T4
  21. #> 6 T5

创建于2023年06月08日,使用reprex v2.0.2

假设仅在每个"XT-YT"对内展开,而不是整个范围(这肯定更容易)。

英文:

There is probably a cleaner way but here is one way:

  1. library(dplyr, warn.conflicts = F)
  2. library(stringr)
  3. library(tidyr)
  4. library(purrr)
  5. structure(list(Range = c(&quot;0T-1T&quot;, &quot;2T-5T&quot;)), class = &quot;data.frame&quot;, row.names = c(NA,
  6. -2L)) %&gt;%
  7. mutate(
  8. Range = str_split(Range, &#39;-&#39;),
  9. Range = map(Range, str_remove, &#39;T&#39;),
  10. Range = map(Range, as.integer),
  11. Range = map(Range, ~ paste0(&#39;T&#39;, seq(.x[1], .x[2], 1)))
  12. ) %&gt;%
  13. unnest(Range)
  14. #&gt; # A tibble: 6 &#215; 1
  15. #&gt; Range
  16. #&gt; &lt;chr&gt;
  17. #&gt; 1 T0
  18. #&gt; 2 T1
  19. #&gt; 3 T2
  20. #&gt; 4 T3
  21. #&gt; 5 T4
  22. #&gt; 6 T5

<sup>Created on 2023-06-08 with reprex v2.0.2</sup>

Assumes to only expand withing each "XT-YT" pair rather than the full range (which would be easier for sure).

huangapple
  • 本文由 发表于 2023年6月9日 05:15:57
  • 转载请务必保留本文链接:https://go.coder-hub.com/76435741.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定