如何在R中为特定值创建一个分组的百分比列

huangapple go评论139阅读模式
英文:

How to create a column with percentages for specific values for a group in R

问题

我有这个数据集

  1. dat = structure(list(mdm = 7:8, price = c(100L, 200L), count = c(200L, 300L)),
  2. class = "data.frame", row.names = c(NA, -2L))

我需要通过添加一个百分比列来转换这个数据,每个mdm组都应该有一个perc列,其值为

  1. 50, 60, 70, 80, 85, 90, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 110, 115, 120, 130, 140, 150

在值 100 对面,应该有来自dat数据集的每个mdm组的pricecount值。

期望的输出:

  1. perc price count
  2. 50 NA NA
  3. 60 NA NA
  4. 70 NA NA
  5. 80 NA NA
  6. 85 NA NA
  7. 90 NA NA
  8. 95 NA NA
  9. 96 NA NA
  10. 97 NA NA
  11. 98 NA NA
  12. 99 NA NA
  13. **100 100 200**
  14. 101 NA NA
  15. 102 NA NA
  16. 103 NA NA
  17. 104 NA NA
  18. 105 NA NA
  19. 110 NA NA
  20. 115 NA NA
  21. 120 NA NA
  22. 130 NA NA
  23. 140 NA NA
  24. 150 NA NA
  25. 50 NA NA
  26. 60 NA NA
  27. 70 NA NA
  28. 80 NA NA
  29. 85 NA NA
  30. 90 NA NA
  31. 95 NA NA
  32. 96 NA NA
  33. 97 NA NA
  34. 98 NA NA
  35. 99 NA NA
  36. **100 200 300**
  37. 101 NA NA
  38. 102 NA NA
  39. 103 NA NA
  40. 104 NA NA
  41. 105 NA NA
  42. 110 NA NA
  43. 115 NA NA
  44. 120 NA NA
  45. 130 NA NA
  46. 140 NA NA
  47. 150 NA NA

mdm=7 的价格和数量的值等于 100 和 200,所以我们将它们放在值 100 附近。

mdm=8 的价格和数量的值等于 200 和 300,所以我们将它们放在值 100 附近。

如何简单实现这个转换?谢谢您的帮助。

英文:

I have this dataset

  1. dat = structure(list(mdm = 7:8, price = c(100L, 200L), count = c(200L, 300L)),
  2. class = "data.frame", row.names = c(NA, -2L))

I need to transform this data by adding a column with percentages for each mdm group. Each group should have a perc column with values

  1. 50, 60, 70, 80, 85, 90, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 110, 115, 120, 130, 140, 150

where opposite the value 100, there should be a price and count value for each group of mdm from the dat dataset.

Desired output:

  1. perc price count
  2. 50 NA NA
  3. 60 NA NA
  4. 70 NA NA
  5. 80 NA NA
  6. 85 NA NA
  7. 90 NA NA
  8. 95 NA NA
  9. 96 NA NA
  10. 97 NA NA
  11. 98 NA NA
  12. 99 NA NA
  13. **100 100 200**
  14. 101 NA NA
  15. 102 NA NA
  16. 103 NA NA
  17. 104 NA NA
  18. 105 NA NA
  19. 110 NA NA
  20. 115 NA NA
  21. 120 NA NA
  22. 130 NA NA
  23. 140 NA NA
  24. 150 NA NA
  25. 50 NA NA
  26. 60 NA NA
  27. 70 NA NA
  28. 80 NA NA
  29. 85 NA NA
  30. 90 NA NA
  31. 95 NA NA
  32. 96 NA NA
  33. 97 NA NA
  34. 98 NA NA
  35. 99 NA NA
  36. **100 200 300**
  37. 101 NA NA
  38. 102 NA NA
  39. 103 NA NA
  40. 104 NA NA
  41. 105 NA NA
  42. 110 NA NA
  43. 115 NA NA
  44. 120 NA NA
  45. 130 NA NA
  46. 140 NA NA
  47. 150 NA NA

mdm=7 values for price and count are equal to 100 and 200, so we put them down near the point where 100.

mdm=8 values for price and count are equal to 200 and 300, so we put them down near the point where 100.

What is the easy way to do it? Thank you for your help.

答案1

得分: 1

将其与expand.grid合并。

  1. merge(cbind(dat, perc=100),
  2. expand.grid(mdm=unique(dat$mdm), perc=c(50, 60, 70, 80, 85, 90, 95, 96, 97,
  3. 98, 99, 100, 101, 102, 103, 104, 105,
  4. 110, 115, 120, 130, 140, 150)),
  5. all=TRUE)
  6. # mdm perc price count
  7. # 1 7 50 NA NA
  8. # 2 7 60 NA NA
  9. # 3 7 70 NA NA
  10. # 4 7 80 NA NA
  11. # 5 7 85 NA NA
  12. # 6 7 90 NA NA
  13. # 7 7 95 NA NA
  14. # 8 7 96 NA NA
  15. # 9 7 97 NA NA
  16. # 10 7 98 NA NA
  17. # 11 7 99 NA NA
  18. # 12 7 100 100 200
  19. # 13 7 101 NA NA
  20. # 14 7 102 NA NA
  21. # 15 7 103 NA NA
  22. # 16 7 104 NA NA
  23. # 17 7 105 NA NA
  24. # 18 7 110 NA NA
  25. # 19 7 115 NA NA
  26. # 20 7 120 NA NA
  27. # 21 7 130 NA NA
  28. # 22 7 140 NA NA
  29. # 23 7 150 NA NA
  30. # 24 8 50 NA NA
  31. # 25 8 60 NA NA
  32. # 26 8 70 NA NA
  33. # 27 8 80 NA NA
  34. # 28 8 85 NA NA
  35. # 29 8 90 NA NA
  36. # 30 8 95 NA NA
  37. # 31 8 96 NA NA
  38. # 32 8 97 NA NA
  39. # 33 8 98 NA NA
  40. # 34 8 99 NA NA
  41. # 35 8 100 200 300
  42. # 36 8 101 NA NA
  43. # 37 8 102 NA NA
  44. # 38 8 103 NA NA
  45. # 39 8 104 NA NA
  46. # 40 8 105 NA NA
  47. # 41 8 110 NA NA
  48. # 42 8 115 NA NA
  49. # 43 8 120 NA NA
  50. # 44 8 130 NA NA
  51. # 45 8 140 NA NA
  52. # 46 8 150 NA NA
英文:

merge it with an expand.grid.

  1. merge(cbind(dat, perc=100),
  2. expand.grid(mdm=unique(dat$mdm), perc=c(50, 60, 70, 80, 85, 90, 95, 96, 97,
  3. 98, 99, 100, 101, 102, 103, 104, 105,
  4. 110, 115, 120, 130, 140, 150)),
  5. all=TRUE)
  6. # mdm perc price count
  7. # 1 7 50 NA NA
  8. # 2 7 60 NA NA
  9. # 3 7 70 NA NA
  10. # 4 7 80 NA NA
  11. # 5 7 85 NA NA
  12. # 6 7 90 NA NA
  13. # 7 7 95 NA NA
  14. # 8 7 96 NA NA
  15. # 9 7 97 NA NA
  16. # 10 7 98 NA NA
  17. # 11 7 99 NA NA
  18. # 12 7 100 100 200
  19. # 13 7 101 NA NA
  20. # 14 7 102 NA NA
  21. # 15 7 103 NA NA
  22. # 16 7 104 NA NA
  23. # 17 7 105 NA NA
  24. # 18 7 110 NA NA
  25. # 19 7 115 NA NA
  26. # 20 7 120 NA NA
  27. # 21 7 130 NA NA
  28. # 22 7 140 NA NA
  29. # 23 7 150 NA NA
  30. # 24 8 50 NA NA
  31. # 25 8 60 NA NA
  32. # 26 8 70 NA NA
  33. # 27 8 80 NA NA
  34. # 28 8 85 NA NA
  35. # 29 8 90 NA NA
  36. # 30 8 95 NA NA
  37. # 31 8 96 NA NA
  38. # 32 8 97 NA NA
  39. # 33 8 98 NA NA
  40. # 34 8 99 NA NA
  41. # 35 8 100 200 300
  42. # 36 8 101 NA NA
  43. # 37 8 102 NA NA
  44. # 38 8 103 NA NA
  45. # 39 8 104 NA NA
  46. # 40 8 105 NA NA
  47. # 41 8 110 NA NA
  48. # 42 8 115 NA NA
  49. # 43 8 120 NA NA
  50. # 44 8 130 NA NA
  51. # 45 8 140 NA NA
  52. # 46 8 150 NA NA

答案2

得分: 1

这是tidyverse方法的代码部分翻译:

  1. library(dplyr)
  2. library(tidyr)
  3. vector <- paste(c(50, 60, 70, 80, 85, 90, 95:105, 110, 115, 120, 130, 140, 150), collapse = ", ")
  4. dat %>%
  5. group_by(mdm) %>%
  6. mutate(perc = vector) %>%
  7. separate_rows(perc, sep=",", convert = TRUE) %>%
  8. ungroup() %>%
  9. select(perc, price, count) %>%
  10. mutate(across(-perc, ~ifelse(perc==100, ., NA_real_))) %>%
  11. print(n=50)
  1. perc price count
  2. <int> <dbl> <dbl>
  3. 1 50 NA NA
  4. 2 60 NA NA
  5. 3 70 NA NA
  6. 4 80 NA NA
  7. 5 85 NA NA
  8. 6 90 NA NA
  9. 7 95 NA NA
  10. 8 96 NA NA
  11. 9 97 NA NA
  12. 10 98 NA NA
  13. 11 99 NA NA
  14. 12 100 100 200
  15. 13 101 NA NA
  16. 14 102 NA NA
  17. 15 103 NA NA
  18. 16 104 NA NA
  19. 17 105 NA NA
  20. 18 110 NA NA
  21. 19 115 NA NA
  22. 20 120 NA NA
  23. 21 130 NA NA
  24. 22 140 NA NA
  25. 23 150 NA NA
  26. 24 50 NA NA
  27. 25 60 NA NA
  28. 26 70 NA NA
  29. 27 80 NA NA
  30. 28 85 NA NA
  31. 29 90 NA NA
  32. 30 95 NA NA
  33. 31 96 NA NA
  34. 32 97 NA NA
  35. 33 98 NA NA
  36. 34 99 NA NA
  37. 35 100 200 300
  38. 36 101 NA NA
  39. 37 102 NA NA
  40. 38 103 NA NA
  41. 39 104 NA NA
  42. 40 105 NA NA
  43. 41 110 NA NA
  44. 42 115 NA NA
  45. 43 120 NA NA
  46. 44 130 NA NA
  47. 45 140 NA NA
  48. 46 150 NA NA
英文:

Here is tidyverse approach:

  1. library(dplyr)
  2. library(tidyr)
  3. vector &lt;- paste(c(50, 60, 70, 80, 85, 90, 95:105, 110, 115, 120, 130, 140, 150), collapse = &quot;, &quot;)
  4. dat %&gt;%
  5. group_by(mdm) %&gt;%
  6. mutate(perc = vector) %&gt;%
  7. separate_rows(perc, sep=&quot;,&quot;, convert = TRUE) %&gt;%
  8. ungroup() %&gt;%
  9. select(perc, price, count) %&gt;%
  10. mutate(across(-perc, ~ifelse(perc==100, ., NA_real_))) %&gt;%
  11. print(n=50)
  1. perc price count
  2. &lt;int&gt; &lt;dbl&gt; &lt;dbl&gt;
  3. 1 50 NA NA
  4. 2 60 NA NA
  5. 3 70 NA NA
  6. 4 80 NA NA
  7. 5 85 NA NA
  8. 6 90 NA NA
  9. 7 95 NA NA
  10. 8 96 NA NA
  11. 9 97 NA NA
  12. 10 98 NA NA
  13. 11 99 NA NA
  14. 12 100 100 200
  15. 13 101 NA NA
  16. 14 102 NA NA
  17. 15 103 NA NA
  18. 16 104 NA NA
  19. 17 105 NA NA
  20. 18 110 NA NA
  21. 19 115 NA NA
  22. 20 120 NA NA
  23. 21 130 NA NA
  24. 22 140 NA NA
  25. 23 150 NA NA
  26. 24 50 NA NA
  27. 25 60 NA NA
  28. 26 70 NA NA
  29. 27 80 NA NA
  30. 28 85 NA NA
  31. 29 90 NA NA
  32. 30 95 NA NA
  33. 31 96 NA NA
  34. 32 97 NA NA
  35. 33 98 NA NA
  36. 34 99 NA NA
  37. 35 100 200 300
  38. 36 101 NA NA
  39. 37 102 NA NA
  40. 38 103 NA NA
  41. 39 104 NA NA
  42. 40 105 NA NA
  43. 41 110 NA NA
  44. 42 115 NA NA
  45. 43 120 NA NA
  46. 44 130 NA NA
  47. 45 140 NA NA
  48. 46 150 NA NA

答案3

得分: 1

你可以使用 tidyr 中的 complete 函数:

  1. tidyr::complete(
  2. cbind(dat, perc = 100),
  3. mdm, perc = c(50, 60, 70, 80, 85, 90, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 110, 115, 120, 130, 140, 150)
  4. )

输出:

  1. # 一个 tibble: 46 × 4
  2. mdm perc price count
  3. <int> <dbl> <int> <int>
  4. 1 7 50 NA NA
  5. 2 7 60 NA NA
  6. 3 7 70 NA NA
  7. 4 7 80 NA NA
  8. 5 7 85 NA NA
  9. 6 7 90 NA NA
  10. 7 7 95 NA NA
  11. 8 7 96 NA NA
  12. 9 7 97 NA NA
  13. 10 7 98 NA NA
  14. 11 7 99 NA NA
  15. 12 7 100 100 200
  16. 13 7 101 NA NA
  17. 14 7 102 NA NA
  18. 15 7 103 NA NA
  19. 16 7 104 NA NA
  20. 17 7 105 NA NA
  21. 18 7 110 NA NA
  22. 19 7 115 NA NA
  23. 20 7 120 NA NA
  24. 21 7 130 NA NA
  25. 22 7 140 NA NA
  26. 23 7 150 NA NA
  27. 24 8 50 NA NA
  28. 25 8 60 NA NA
  29. 26 8 70 NA NA
  30. 27 8 80 NA NA
  31. 28 8 85 NA NA
  32. 29 8 90 NA NA
  33. 30 8 95 NA NA
  34. 31 8 96 NA NA
  35. 32 8 97 NA NA
  36. 33 8 98 NA NA
  37. 34 8 99 NA NA
  38. 35 8 100 200 300
  39. 36 8 101 NA NA
  40. 37 8 102 NA NA
  41. 38 8 103 NA NA
  42. 39 8 104 NA NA
  43. 40 8 105 NA NA
  44. 41 8 110 NA NA
  45. 42 8 115 NA NA
  46. 43 8 120 NA NA
  47. 44 8 130 NA NA
  48. 45 8 140 NA NA
  49. 46 8 150 NA NA

这是 R 代码的翻译。

英文:

You can use complete from tidyr:

  1. tidyr::complete(
  2. cbind(dat, perc = 100),
  3. mdm, perc = c(50, 60, 70, 80, 85, 90, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 110, 115, 120, 130, 140, 150)
  4. )

Output:

  1. # A tibble: 46 &#215; 4
  2. mdm perc price count
  3. &lt;int&gt; &lt;dbl&gt; &lt;int&gt; &lt;int&gt;
  4. 1 7 50 NA NA
  5. 2 7 60 NA NA
  6. 3 7 70 NA NA
  7. 4 7 80 NA NA
  8. 5 7 85 NA NA
  9. 6 7 90 NA NA
  10. 7 7 95 NA NA
  11. 8 7 96 NA NA
  12. 9 7 97 NA NA
  13. 10 7 98 NA NA
  14. 11 7 99 NA NA
  15. 12 7 100 100 200
  16. 13 7 101 NA NA
  17. 14 7 102 NA NA
  18. 15 7 103 NA NA
  19. 16 7 104 NA NA
  20. 17 7 105 NA NA
  21. 18 7 110 NA NA
  22. 19 7 115 NA NA
  23. 20 7 120 NA NA
  24. 21 7 130 NA NA
  25. 22 7 140 NA NA
  26. 23 7 150 NA NA
  27. 24 8 50 NA NA
  28. 25 8 60 NA NA
  29. 26 8 70 NA NA
  30. 27 8 80 NA NA
  31. 28 8 85 NA NA
  32. 29 8 90 NA NA
  33. 30 8 95 NA NA
  34. 31 8 96 NA NA
  35. 32 8 97 NA NA
  36. 33 8 98 NA NA
  37. 34 8 99 NA NA
  38. 35 8 100 200 300
  39. 36 8 101 NA NA
  40. 37 8 102 NA NA
  41. 38 8 103 NA NA
  42. 39 8 104 NA NA
  43. 40 8 105 NA NA
  44. 41 8 110 NA NA
  45. 42 8 115 NA NA
  46. 43 8 120 NA NA
  47. 44 8 130 NA NA
  48. 45 8 140 NA NA
  49. 46 8 150 NA NA

huangapple
  • 本文由 发表于 2023年2月19日 17:26:08
  • 转载请务必保留本文链接:https://go.coder-hub.com/75499135.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定