Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.69 KB | None | 0 0
  1. set.seed(100)
  2. df <- data.frame(cat = c(rep("aaa", 5), rep("bbb", 5), rep("ccc", 5)), val = runif(15))
  3. df <- df[order(df$cat, df$val), ]
  4. df
  5.  
  6. cat val
  7. 1 aaa 0.05638315
  8. 2 aaa 0.25767250
  9. 3 aaa 0.30776611
  10. 4 aaa 0.46854928
  11. 5 aaa 0.55232243
  12. 6 bbb 0.17026205
  13. 7 bbb 0.37032054
  14. 8 bbb 0.48377074
  15. 9 bbb 0.54655860
  16. 10 bbb 0.81240262
  17. 11 ccc 0.28035384
  18. 12 ccc 0.39848790
  19. 13 ccc 0.62499648
  20. 14 ccc 0.76255108
  21. 15 ccc 0.88216552
  22.  
  23. df$num <- 1
  24. for (i in 2:(length(df[,1]))) {
  25. if (df[i,"cat"]==df[(i-1),"cat"]) {
  26. df[i,"num"]<-df[i-1,"num"]+1
  27. }
  28. }
  29. df
  30.  
  31. cat val num
  32. 1 aaa 0.05638315 1
  33. 2 aaa 0.25767250 2
  34. 3 aaa 0.30776611 3
  35. 4 aaa 0.46854928 4
  36. 5 aaa 0.55232243 5
  37. 6 bbb 0.17026205 1
  38. 7 bbb 0.37032054 2
  39. 8 bbb 0.48377074 3
  40. 9 bbb 0.54655860 4
  41. 10 bbb 0.81240262 5
  42. 11 ccc 0.28035384 1
  43. 12 ccc 0.39848790 2
  44. 13 ccc 0.62499648 3
  45. 14 ccc 0.76255108 4
  46. 15 ccc 0.88216552 5
  47.  
  48. df$num <- ave(df$val, df$cat, FUN = seq_along)
  49.  
  50. library(plyr)
  51. ddply(df, .(cat), mutate, id = seq_along(val))
  52.  
  53. library(dplyr)
  54. df %>% group_by(cat) %>% mutate(id = row_number())
  55.  
  56. library(data.table)
  57. DT <- data.table(df)
  58.  
  59. DT[, id := seq_len(.N), by = cat]
  60. DT[, id := rowid(cat)]
  61.  
  62. df$num <- sequence(rle(df$cat)$lengths)
  63.  
  64. > df
  65. cat val num
  66. 4 aaa 0.05638315 1
  67. 2 aaa 0.25767250 2
  68. 1 aaa 0.30776611 3
  69. 5 aaa 0.46854928 4
  70. 3 aaa 0.55232243 5
  71. 10 bbb 0.17026205 1
  72. 8 bbb 0.37032054 2
  73. 6 bbb 0.48377074 3
  74. 9 bbb 0.54655860 4
  75. 7 bbb 0.81240262 5
  76. 13 ccc 0.28035384 1
  77. 14 ccc 0.39848790 2
  78. 11 ccc 0.62499648 3
  79. 15 ccc 0.76255108 4
  80. 12 ccc 0.88216552 5
  81.  
  82. df$num <- sequence(rle(as.character(df$cat))$lengths)
  83.  
  84. for (i in unique(df$cat)) df$num[df$cat == i] <- seq_len(sum(df$cat == i))
  85.  
  86. # 1. Data set
  87. set.seed(100)
  88. df <- data.frame(
  89. cat = c(rep("aaa", 5), rep("ccc", 5), rep("bbb", 5)),
  90. val = runif(15))
  91.  
  92. # 2. 'dplyr' approach
  93. df %>%
  94. arrange(cat, val) %>%
  95. group_by(cat) %>%
  96. mutate(id = row_number())
  97.  
  98. # Variant with ascending ordering
  99. library(data.table)
  100. dt <- data.table(df)
  101. dt[, .( val
  102. , num = rank(val))
  103. , by = list(cat)][order(cat, num),]
  104.  
  105. cat val num
  106. 1: aaa 0.05638315 1
  107. 2: aaa 0.25767250 2
  108. 3: aaa 0.30776611 3
  109. 4: aaa 0.46854928 4
  110. 5: aaa 0.55232243 5
  111. 6: bbb 0.17026205 1
  112. 7: bbb 0.37032054 2
  113. 8: bbb 0.48377074 3
  114. 9: bbb 0.54655860 4
  115. 10: bbb 0.81240262 5
  116. 11: ccc 0.28035384 1
  117. 12: ccc 0.39848790 2
  118. 13: ccc 0.62499648 3
  119. 14: ccc 0.76255108 4
  120.  
  121. # Variant with descending ordering
  122. dt[, .( val
  123. , num = rank(-val))
  124. , by = list(cat)][order(cat, num),]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement