Как создать несколько рядов номеров на базе данных в R? - PullRequest
3 голосов
/ 11 марта 2020

У меня есть подобные фреймы данных

df <- data.frame(start = 1:9, end = seq(2,18,by = 2))

# Now I want to generate multiple series number set base on these 2 columns
# The ideal result should be looks like this way

1,2
2,3,4
3,4,5,6
....

Может кто-нибудь помочь мне с этим? Thx

Ответы [ 3 ]

4 голосов
/ 11 марта 2020

Похоже, что мы можем сделать это в каждой строке с помощью Map, применив : к data.frame так, чтобы левый и правый были соответствующие элементы 'start', 'end', то есть 1:2, 2:4, et c.

do.call(Map, c(f = `:`, df))
#[[1]]
#[1] 1 2

#[[2]]
#[1] 2 3 4

#[[3]]
#[1] 3 4 5 6

#[[4]]
#[1] 4 5 6 7 8

#[[5]]
#[1]  5  6  7  8  9 10

#[[6]]
#[1]  6  7  8  9 10 11 12

#[[7]]
#[1]  7  8  9 10 11 12 13 14

#[[8]]
#[1]  8  9 10 11 12 13 14 15 16

#[[9]]
# [1]  9 10 11 12 13 14 15 16 17 18
2 голосов
/ 11 марта 2020

Тидиверс-решение может выглядеть так:

library(dplyr)
res_df <- df %>%
  rowwise() %>%
  mutate(msn = list(seq(start, end)))

pull(res_df, msn)
#> [[1]]
#> [1] 1 2
#> 
#> [[2]]
#> [1] 2 3 4
#> 
#> [[3]]
#> [1] 3 4 5 6
#> 
#> [[4]]
#> [1] 4 5 6 7 8
#> 
#> [[5]]
#> [1]  5  6  7  8  9 10
#> 
#> [[6]]
#> [1]  6  7  8  9 10 11 12
#> 
#> [[7]]
#> [1]  7  8  9 10 11 12 13 14
#> 
#> [[8]]
#> [1]  8  9 10 11 12 13 14 15 16
#> 
#> [[9]]
#>  [1]  9 10 11 12 13 14 15 16 17 18

или вот так:

library(purrr)
map2(df$start, df$end, seq)
#> [[1]]
#> [1] 1 2
#> 
#> [[2]]
#> [1] 2 3 4
#> 
#> [[3]]
#> [1] 3 4 5 6
#> 
#> [[4]]
#> [1] 4 5 6 7 8
#> 
#> [[5]]
#> [1]  5  6  7  8  9 10
#> 
#> [[6]]
#> [1]  6  7  8  9 10 11 12
#> 
#> [[7]]
#> [1]  7  8  9 10 11 12 13 14
#> 
#> [[8]]
#> [1]  8  9 10 11 12 13 14 15 16
#> 
#> [[9]]
#>  [1]  9 10 11 12 13 14 15 16 17 18
2 голосов
/ 11 марта 2020
apply(df,1,function(x){c(x[1]:x[2])})

[[1]]
[1] 1 2

[[2]]
[1] 2 3 4

[[3]]
[1] 3 4 5 6

[[4]]
[1] 4 5 6 7 8

[[5]]
[1]  5  6  7  8  9 10

[[6]]
[1]  6  7  8  9 10 11 12

[[7]]
[1]  7  8  9 10 11 12 13 14

[[8]]
[1]  8  9 10 11 12 13 14 15 16

[[9]]
 [1]  9 10 11 12 13 14 15 16 17 18
...