使用group_by从所有组中减去一组值。

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

Subtract one group of values from all groups using group_by

问题

你可以使用以下代码来使用 group_by 在 tibble 中从所有值中减去类别 "A" 的值。以下是一个示例和预期结果:

  1. library(dplyr)
  2. d <- tibble(categories = c(rep("A", 3), rep("B", 3), rep("C", 3)),
  3. values = 1:9)
  4. d <- d %>%
  5. group_by(categories) %>%
  6. mutate(values = values - first(values[categories == "A"]))
  7. # 预期结果
  8. d <- tibble(categories = c(rep("A", 3), rep("B", 3), rep("C", 3)),
  9. values = c(0, 0, 0, 3, 3, 3, 6, 6, 6))

这段代码会将类别 "A" 的值从所有值中减去,得到预期的结果。

英文:

How can I subtract one group of values from all values using group_by in tibble.
Below is an example with expected results. I wish to subtract values of category "A" from all values

  1. d &lt;- tibble(categories = c(rep(&quot;A&quot;, 3), rep(&quot;B&quot;, 3), rep(&quot;C&quot;, 3)),
  2. values = 1:9)
  3. # expected outcome
  4. d &lt;- tibble(categories = c(rep(&quot;A&quot;, 3), rep(&quot;B&quot;, 3), rep(&quot;C&quot;, 3)),
  5. values = c(0, 0, 0, 3, 3, 3, 6, 6, 6))
  6. </details>
  7. # 答案1
  8. **得分**: 2
  9. 如果类别大小相同长度,我们可以执行以下操作:
  10. ```R
  11. library(dplyr)
  12. d %>%
  13. mutate(values = values - d$values[d$categories == "A"])
  • 输出
  1. # A tibble: 9 × 2
  2. categories values
  3. <chr> <int>
  4. 1 A 0
  5. 2 A 0
  6. 3 A 0
  7. 4 B 3
  8. 5 B 3
  9. 6 B 3
  10. 7 C 6
  11. 8 C 6
  12. 9 C 6
英文:

If the categories size are the same length, we could do

  1. library(dplyr)
  2. d %&gt;%
  3. mutate(values = values - d$values[d$categories == &quot;A&quot;])

-output

  1. # A tibble: 9 &#215; 2
  2. categories values
  3. &lt;chr&gt; &lt;int&gt;
  4. 1 A 0
  5. 2 A 0
  6. 3 A 0
  7. 4 B 3
  8. 5 B 3
  9. 6 B 3
  10. 7 C 6
  11. 8 C 6
  12. 9 C 6

答案2

得分: 0

你可以这样做:

  1. library(tidyverse)
  2. d %>%
  3. group_by(categories) %>%
  4. mutate(id = row_number()) %>%
  5. ungroup() %>%
  6. pivot_wider(names_from = 'categories',
  7. values_from = 'values') %>%
  8. mutate(across(-id, ~ . - A)) %>%
  9. pivot_longer(cols = -id,
  10. names_to = 'categories',
  11. values_to = 'values',
  12. cols_vary = 'slowest') %>%
  13. select(-id)

或者,你也可以尝试以下方法:

  1. d %>%
  2. group_by(categories) %>%
  3. mutate(id = row_number()) %>%
  4. ungroup() %>%
  5. mutate(values = values - values[categories == 'A' & id == id]) %>%
  6. select(-id)

A tibble: 9 x 2

categories values

1 A 0
2 A 0
3 A 0
4 B 3
5 B 3
6 B 3
7 C 6
8 C 6
9 C 6

  1. <details>
  2. <summary>英文:</summary>
  3. You can do:
  4. library(tidyverse)
  5. d %&gt;%
  6. group_by(categories) %&gt;%
  7. mutate(id = row_number()) %&gt;%
  8. ungroup() %&gt;%
  9. pivot_wider(names_from = &#39;categories&#39;,
  10. values_from = &#39;values&#39;) %&gt;%
  11. mutate(across(-id, ~ . - A)) %&gt;%
  12. pivot_longer(cols = -id,
  13. names_to = &#39;categories&#39;,
  14. values_to = &#39;values&#39;,
  15. cols_vary = &#39;slowest&#39;) %&gt;%
  16. select(-id)
  17. Alternatively:
  18. d %&gt;%
  19. group_by(categories) %&gt;%
  20. mutate(id = row_number()) %&gt;%
  21. ungroup() %&gt;%
  22. mutate(values = values - values[categories == &#39;A&#39; &amp; id == id]) %&gt;%
  23. select(-id)
  24. # A tibble: 9 x 2
  25. categories values
  26. &lt;chr&gt; &lt;int&gt;
  27. 1 A 0
  28. 2 A 0
  29. 3 A 0
  30. 4 B 3
  31. 5 B 3
  32. 6 B 3
  33. 7 C 6
  34. 8 C 6
  35. 9 C 6
  36. </details>

huangapple
  • 本文由 发表于 2023年2月8日 13:27:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/75381677.html
匿名

发表评论

匿名网友

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

确定