【问题标题】:how to calculate gaps between two columns in r如何计算r中两列之间的间隙
【发布时间】:2021-10-14 04:06:09
【问题描述】:

我正在计算前一个“结束”数字与下一个“开始”数字之间的差距。参考随附的数据,例如,结果在 df$gap 中。在第一行,数字是 df$gap=df$start[1]-1。其余的结果将是 df$start[n]-df$end[n-1]。我可以在 Excel 中轻松地做到这一点,但是,我很难弄清楚如何在没有循环的情况下在 R 中做到这一点。

如果有人能提供解决方案,将不胜感激!

df = read.table(text="start  end
   172  635
   766 1699
  1817 1891
  2015 2320", header=T)

预期结果:

  start  end  gap
   172  635   171
   766 1699   131
  1817 1891   118
  2015 2320   124

【问题讨论】:

    标签: r


    【解决方案1】:

    在基础 R 中:

    df$gap <- df$start - c(1L, head(df$end, -1))
    

    给予:

    df
      start  end gap
    1   172  635 171
    2   766 1699 131
    3  1817 1891 118
    4  2015 2320 124
    

    【讨论】:

      【解决方案2】:

      使用dplyr 这是使用lag 的解决方案

      df %>% mutate(gap = start - lag(end))%>%
                 mutate(gap = ifelse(row_number() == 1,start -1,gap))
      

      输出:

          start  end gap
      1   172  635 171
      2   766 1699 131
      3  1817 1891 118
      4  2015 2320 124
      

      【讨论】:

        【解决方案3】:

        dplyr 加上一个小技巧可以帮助解决这个问题:

        library(dplyr)
        
        df = read.table(text="start  end
           172  635
           766 1699
          1817 1891
          2015 2320", header=T)
        
        df$temp <- c(1, df$end[-length(df$end)])
        
        mutate(df, gap = start - temp) |> select(-temp)
        

        输出:

          start  end gap
        1   172  635 171
        2   766 1699 131
        3  1817 1891 118
        4  2015 2320 124
        

        【讨论】:

          【解决方案4】:

          data.table 包的一种可能解决方案

          请在下面找到reprex。

          REPREX

          library(data.table)
          
          DT <- setDT(df)
          
          DT[, end_lead := shift(end,1)][, `:=` (gap = start - end_lead, end_lead = NULL)]
          
          setnafill(DT, fill = DT$start[1] - 1)
          
          DT
          #>    start  end gap
          #> 1:   172  635 171
          #> 2:   766 1699 131
          #> 3:  1817 1891 118
          #> 4:  2015 2320 124
          

          reprex package (v0.3.0) 于 2021 年 10 月 13 日创建

          【讨论】:

            【解决方案5】:

            如果我收到您的问题,一种解决方案可能是来自dplyrlag 函数

            举个例子:

            df[,'gap']  = df[,'start'] - lag(df[,"end"], n = 1)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-07-23
              • 2016-09-11
              • 1970-01-01
              • 1970-01-01
              • 2020-05-06
              • 1970-01-01
              • 1970-01-01
              • 2014-09-21
              相关资源
              最近更新 更多