如何在 R 中创建一个新列,其中算术应用于给定组的相反值

How to create a new column in R where arithmetic is applied on opposite values given a group

假设有以下数据框:

group value1 value2
1 16 2
1 20 4
2 12 2
2 8 6
3 10 7
3 14 5

我想创建一个 table 将 value2 除以 value1。但是,我希望它是同一组中唯一的其他唯一值。我附上了一张图片来演示这个过程。

here is an image of what I'm trying to achieve

完成后,输出应如下所示:

group value1 value2 perc
1 16 2 2/20 10
1 20 4 4/16 25
2 12 2 2/8 25
2 8 6 6/12 50
3 10 7 7/14 50
3 14 5 5/10 50

(我在 perc 列中添加了分数,因此它符合我的图像,我只想要每行末尾的值)

目前,我很难解决这个问题,我意识到它可能与 setdiff 和选择该组中唯一的其他唯一值有关(每组只有两行)但我我不确定如何。任何帮助深表感谢。谢谢!

我们可以rev改掉value1的顺序,然后计算perc列。

library(dplyr)

df %>% 
  group_by(group) %>% 
  mutate(value3 = rev(value1),
         perc = (value2/value3)*100) %>% 
  select(-value3)

# A tibble: 6 × 4
# Groups:   group [3]
  group value1 value2  perc
  <int>  <int>  <int> <dbl>
1     1     16      2    10
2     1     20      4    25
3     2     12      2    25
4     2      8      6    50
5     3     10      7    50
6     3     14      5    50

数据

df <- read.table(header = T, text = "
group   value1  value2
1   16  2
1   20  4
2   12  2
2   8   6
3   10  7
3   14  5")

您可以使用 leadlag 获取当前行上方或下方的单元格。两个结果可以合并:

library(tidyverse)

data <- tribble(
  ~group, ~value1, ~value2,
  1L, 16L, 2L,
  1L, 20L, 4L,
  2L, 12L, 2L,
  2L, 8L, 6L,
  3L, 10L, 7L,
  3L, 14L, 5L
)

full_join(
  data %>%
    group_by(group) %>%
    mutate(
      frac = value2 / lead(value1),
      perc_text = str_glue("{value2}/{lead(value1)} {frac * 100}")
    ) %>%
    filter(!is.na(frac)),
  data %>%
    group_by(group) %>%
    mutate(
      frac = value2 / lag(value1),
      perc_text = str_glue("{value2}/{lag(value1)} {frac * 100}")
    ) %>%
    filter(!is.na(frac))
) %>%
  arrange(group)
#> Joining, by = c("group", "value1", "value2", "frac", "perc_text")
#> # A tibble: 6 × 5
#> # Groups:   group [3]
#>   group value1 value2  frac perc_text
#>   <int>  <int>  <int> <dbl> <glue>   
#> 1     1     16      2  0.1  2/20 10  
#> 2     1     20      4  0.25 4/16 25  
#> 3     2     12      2  0.25 2/8 25   
#> 4     2      8      6  0.5  6/12 50  
#> 5     3     10      7  0.5  7/14 50  
#> 6     3     14      5  0.5  5/10 50

reprex package (v2.0.0)

于 2022-04-07 创建