代码之家  ›  专栏  ›  技术社区  ›  the_darkside

根据id和行号分配索引[重复]

  •  0
  • the_darkside  · 技术社区  · 7 年前

    set.seed(100)  
    df <- data.frame(cat = c(rep("aaa", 5), rep("bbb", 5), rep("ccc", 5)), val = runif(15))             
    df <- df[order(df$cat, df$val), ]  
    df  
    
       cat        val  
    1  aaa 0.05638315  
    2  aaa 0.25767250  
    3  aaa 0.30776611  
    4  aaa 0.46854928  
    5  aaa 0.55232243  
    6  bbb 0.17026205  
    7  bbb 0.37032054  
    8  bbb 0.48377074  
    9  bbb 0.54655860  
    10 bbb 0.81240262  
    11 ccc 0.28035384  
    12 ccc 0.39848790  
    13 ccc 0.62499648  
    14 ccc 0.76255108  
    15 ccc 0.88216552 
    

    我正在尝试在每个组中添加一个带有编号的列。这样做显然没有使用R的力量:

     df$num <- 1  
     for (i in 2:(length(df[,1]))) {  
       if (df[i,"cat"]==df[(i-1),"cat"]) {  
         df[i,"num"]<-df[i-1,"num"]+1  
         }  
     }  
     df  
    
       cat        val num  
    1  aaa 0.05638315   1  
    2  aaa 0.25767250   2  
    3  aaa 0.30776611   3  
    4  aaa 0.46854928   4  
    5  aaa 0.55232243   5  
    6  bbb 0.17026205   1  
    7  bbb 0.37032054   2  
    8  bbb 0.48377074   3  
    9  bbb 0.54655860   4  
    10 bbb 0.81240262   5  
    11 ccc 0.28035384   1  
    12 ccc 0.39848790   2  
    13 ccc 0.62499648   3  
    14 ccc 0.76255108   4  
    15 ccc 0.88216552   5  
    

    这样做的好方法是什么?

    0 回复  |  直到 8 年前
        1
  •  1
  •   stevec Zxeenu    5 年前

    使用 ave , ddply , dplyr data.table :

    df$num <- ave(df$val, df$cat, FUN = seq_along)
    

    或:

    library(plyr)
    ddply(df, .(cat), mutate, id = seq_along(val))
    

    library(dplyr)
    df %>% group_by(cat) %>% mutate(id = row_number())
    

    或(内存效率最高,因为它在 DT ):

    library(data.table)
    DT <- data.table(df)
    
    DT[, id := seq_len(.N), by = cat]
    DT[, id := rowid(cat)]
    
        2
  •  0
  •   gdkrmr Pittoro    5 年前

    谢谢你做这个 问题更完整,一个基本的R选项 sequence rle

    df$num <- sequence(rle(df$cat)$lengths)
    

    它给出了预期的结果:

    > df
       cat        val num
    4  aaa 0.05638315   1
    2  aaa 0.25767250   2
    1  aaa 0.30776611   3
    5  aaa 0.46854928   4
    3  aaa 0.55232243   5
    10 bbb 0.17026205   1
    8  bbb 0.37032054   2
    6  bbb 0.48377074   3
    9  bbb 0.54655860   4
    7  bbb 0.81240262   5
    13 ccc 0.28035384   1
    14 ccc 0.39848790   2
    11 ccc 0.62499648   3
    15 ccc 0.76255108   4
    12 ccc 0.88216552   5
    

    df$cat 是一个因子变量,您需要将其封装在 as.character 第一:

    df$num <- sequence(rle(as.character(df$cat))$lengths)