【问题标题】:How to generate multiple number series base on a dataframe in R?如何根据 R 中的数据框生成多个数字系列?
【发布时间】:2020-03-11 18:54:43
【问题描述】:

我有一个像这样的数据框

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
....

有人可以帮我解决这个问题吗?谢谢

【问题讨论】:

    标签: r numbers seq


    【解决方案1】:

    看起来我们可以通过在 data.frame 上应用 : 来在每一行上使用 Map 执行此操作,以便左侧和右侧将是“开始”、“结束”的对应元素,即 @987654323 @、2:4

    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】:
      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
      

      【讨论】:

      • 谢谢你,祝你有美好的一天
      【解决方案3】:

      tidyverse 解决方案可能如下所示:

      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
      

      【讨论】:

      • 谢谢你,祝你有美好的一天
      猜你喜欢
      • 2020-03-28
      • 2020-06-01
      • 2013-02-28
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多