如何在 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")
您可以使用 lead
和 lag
获取当前行上方或下方的单元格。两个结果可以合并:
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 创建
假设有以下数据框:
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")
您可以使用 lead
和 lag
获取当前行上方或下方的单元格。两个结果可以合并:
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 创建