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

lf5gs5x2  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(167)

如何在tibble中使用group_by从所有值中减去一组值。下面是一个预期结果的示例。我希望从所有值中减去类别“A”的值

d <- tibble(categories = c(rep("A", 3), rep("B", 3), rep("C", 3)), 
            values = 1:9)

# expected outcome

d <- tibble(categories = c(rep("A", 3), rep("B", 3), rep("C", 3)), 
            values = c(0, 0, 0, 3, 3, 3, 6, 6, 6))
eoxn13cs

eoxn13cs1#

如果类别大小相同,我们可以

library(dplyr)
 d %>%
   mutate(values = values - d$values[d$categories == "A"])
  • 输出
# A tibble: 9 × 2
  categories values
  <chr>       <int>
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
7kjnsjlb

7kjnsjlb2#

您可以:

library(tidyverse)
d %>% 
  group_by(categories) %>%
  mutate(id = row_number()) %>%
  ungroup() %>%
  pivot_wider(names_from = 'categories',
              values_from = 'values') %>%
  mutate(across(-id, ~ . - A)) %>%
  pivot_longer(cols = -id,
               names_to = 'categories',
               values_to = 'values',
               cols_vary = 'slowest') %>%
  select(-id)

或者:

d %>% 
  group_by(categories) %>%
  mutate(id = row_number()) %>%
  ungroup() %>%
  mutate(values = values - values[categories == 'A' & id == id]) %>%
  select(-id)

# A tibble: 9 x 2
  categories values
  <chr>       <int>
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

相关问题