【问题标题】:Refer to the next row of a different column in r参考 r 中不同列的下一行
【发布时间】:2021-06-10 19:48:05
【问题描述】:

我想根据以下信息创建一个“结束”时间列

case<-c(3,3,3,57,57,57,57,9,9,9)
a<-c(12,15,20,12,14,15,17,14,16,19)
c<-c(25,25,25,21,21,21,21,24,24,24)

data<-data.frame(case,a,c)

   case  a  c
1     3 12 25
2     3 15 25
3     3 20 25
4    57 12 21
5    57 14 21
6    57 15 21
7    57 17 21
8     9 14 24
9     9 16 24
10    9 19 24

c 列提供最后一个条目的结束时间。我需要通过减去下一个列的结束时间-1来创建一个列b。

所以最终的产品应该是这样的

   case  a  b  c
1     3 12 14 25
2     3 15 19 25
3     3 20 25 25
4    57 12 13 21
5    57 14 14 21
6    57 15 16 21
7    57 17 21 21
8     9 14 15 24
9     9 16 17 24
10    9 19 24 24

本质上,[column b row 1] 是 [column a row 2] - 1,按大小写。

我的第一步是 group_by(case),然后我将创建一个 d 的虚拟列,即 a-1,并尝试 match(),但我不确定如何引用不同的行。

b

数据

【问题讨论】:

  • 倒数第二个b值应该是18吗?

标签: r


【解决方案1】:

第一步没问题,然后创建一个新列,它是列 (a-1) 的前导,默认值(最后一个值)等于 c 列的最后一个值。

library(dplyr)
data %>% 
  group_by(case) %>% 
  mutate(b = lead(a-1, default = last(c))) %>% 
  ungroup()

    case     a     c     b
   <dbl> <dbl> <dbl> <dbl>
 1     3    12    25    14
 2     3    15    25    19
 3     3    20    25    25
 4    57    12    21    13
 5    57    14    21    14
 6    57    15    21    16
 7    57    17    21    21
 8     9    14    24    15
 9     9    16    24    18
10     9    19    24    24

【讨论】:

    【解决方案2】:

    基础R

    do.call(rbind,
      by(data,list(data$case),function(x){
        cbind(
          x,
          "b"=c(tail(x$a,-1)-1,x$c[1])
        )
      })
    )
    
         case  a  c  b
    3.1     3 12 25 14
    3.2     3 15 25 19
    3.3     3 20 25 25
    9.8     9 14 24 15
    9.9     9 16 24 18
    9.10    9 19 24 24
    57.4   57 12 21 13
    57.5   57 14 21 14
    57.6   57 15 21 16
    57.7   57 17 21 21
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2014-09-10
      相关资源
      最近更新 更多