for loop & if function in R

后端 未结 3 1598
刺人心
刺人心 2021-01-27 19:22

I was writing a loop with if function in R. The table is like below:

ID  category
1   a
1   b
1   c
2   a
2   b
3   a
3   b
4   a
5   a

I want

3条回答
  •  醉话见心
    2021-01-27 19:57

    There are packages and vectorized ways to do this task, but if you are practicing with loops try:

    output1$rn <- 1
    for (i in 2:nrow(output1)){
      if(output1[i,1] == output1[i-1,1]){
        output1[i,"rn"]<- output1[i-1,"rn"]+1
      } 
    
      else{
         output1[i,"rn"]<-1
       } 
    }
    

    With your original code, when you made this call output1[i-1,"rn"]+1 in the third line of your loop, you were referencing a row that didn't exist on the first pass. By first creating the row and filling it with the value 1, you give the loop something explicit to refer to.

    output1
    #   ID category rn
    # 1  1        a  1
    # 2  1        b  2
    # 3  1        c  3
    # 4  2        a  1
    # 5  2        b  2
    # 6  3        a  1
    # 7  3        b  2
    # 8  4        a  1
    # 9  5        a  1
    

    With the package dplyr you can accomplish it quickly with:

    library(dplyr)
    output1 %>% group_by(ID) %>% mutate(rn = 1:n())
    

    Or with data.table:

    library(data.table)
    setDT(output1)[,rn := 1:.N, by=ID]
    

    With base R you can also use:

    output1$rn <- with(output1, ave(as.character(category), ID, FUN=seq))
    

    There are vignettes and tutorials on the two packages mentioned, and by searching ?ave in the R console for the last approach.

提交回复
热议问题