Home > Back-end >  Adding a value based on a sequence of numbers
Adding a value based on a sequence of numbers

Time:12-16

Please simplify my code. The result should be the same. The script works but R shows warning messages: 1: In data$sygnature[seq(first[v], last[v])] <- paste0(n[v], "/", syg) : number of items to replace is not a multiple of replacement length etc. The idea is to assign each sequence in the column the same value.

  data <- data.frame(sygnature = c(seq(1:8),seq(1:3),seq(1:11),seq(1:6),seq(1:9),seq(1:5)))
  n <- c(44:49)
  
  k<-c()
  for(i in (1: nrow(data))){
    
    s<- data$sygnature[i]
    z<-data$sygnature[i 1]
    
    if(
      if(is.na(z)){
        z<-1
        s > z
      }else{
        s > z
      }
    ){
      k<- c(k, s)
    }
  } 
  last<- cumsum(k)
  first<-(last-k) 1
  syg <- data$sygnature
  for(v in 1:6)
  {
    data$sygnature[seq(first[v],last[v])] <- paste0(n[v],"/",syg)
  }

CodePudding user response:

You can do,

data$res <- paste0(rep(n, aggregate(sygnature ~ cumsum(sygnature == 1), data, length)[[2]]),
                   '/', 
                   data$sygnature)
data

   sygnature   res
1          1  44/1
2          2  44/2
3          3  44/3
4          4  44/4
5          5  44/5
6          6  44/6
7          7  44/7
8          8  44/8
9          1  45/1
10         2  45/2
11         3  45/3
12         1  46/1
13         2  46/2
14         3  46/3
15         4  46/4
16         5  46/5
17         6  46/6
18         7  46/7
19         8  46/8
20         9  46/9
21        10 46/10
22        11 46/11
23         1  47/1
24         2  47/2
25         3  47/3
26         4  47/4
27         5  47/5
28         6  47/6
29         1  48/1
30         2  48/2
31         3  48/3
32         4  48/4
33         5  48/5
34         6  48/6
35         7  48/7
36         8  48/8
37         9  48/9
38         1  49/1
39         2  49/2
40         3  49/3
41         4  49/4
42         5  49/5
  •  Tags:  
  • r
  • Related