R中分组的dplyr数据的特定行的迭代划分
Iterative dividing by specific row for grouped dplyr data in R
我想迭代地将每个值除以分组变量每个级别中的特定行。这是一些示例数据:
library(tidyverse)
d <- structure(list(group = c("blue", "blue", "blue", "red", "red",
"red", "yellow", "yellow", "yellow", "green", "green", "green"
), level = c("a", "b", "c", "a", "b", "c", "a", "b", "c", "a",
"b", "c"), value = c(1.666667, 1.333333, 1, 5, 4, 1, 6, 5, 1, 2.75, 2.25, 1)), row.names = c(NA,
-12L), class = c("tbl_df", "tbl", "data.frame"))
d
# A tibble: 12 x 3
group level value
<chr> <chr> <dbl>
1 blue a 5
2 blue b 4
3 blue c 3
4 red a 10
5 red b 8
6 red c 2
7 yellow a 6
8 yellow b 5
9 yellow c 1
10 green a 11
11 green b 9
12 green c 4
所以,假设我想将每个组中找到的每个值除以 c 级别。在这种情况下,结果将如下所示:
result
# A tibble: 12 x 3
group level value
<chr> <chr> <dbl>
1 blue a 1.67
2 blue b 1.33
3 blue c 1
4 red a 5
5 red b 4
6 red c 1
7 yellow a 6
8 yellow b 5
9 yellow c 1
10 green a 2.75
11 green b 2.25
12 green c 1
有没有办法使用 tidyverse 功能来做到这一点?
假设level
在'group'中不重复,按'group'分组后,提取'c'对应的'value'( value[level == 'c']
) 并用它来划分 'value' 列
library(dplyr)
d %>%
group_by(group) %>%
mutate(value = value/value[level == 'c'])
# A tibble: 12 x 3
# Groups: group [4]
# group level value
# <chr> <chr> <dbl>
# 1 blue a 1.67
# 2 blue b 1.33
# 3 blue c 1
# 4 red a 5
# 5 red b 4
# 6 red c 1
# 7 yellow a 6
# 8 yellow b 5
# 9 yellow c 1
#10 green a 2.75
#11 green b 2.25
#12 green c 1
或者如果有多个'c',则使用match
获取'c'
第一次出现的索引
d %>%
group_by(group) %>%
mutate(value = value/value[match('c', level)])
或使用base R
d$value <- d$value/with(subset(d, level == 'c'), setNames(value, group)[d$group])
数据
d <- structure(list(group = c("blue", "blue", "blue", "red", "red",
"red", "yellow", "yellow", "yellow", "green", "green", "green"
), level = c("a", "b", "c", "a", "b", "c", "a", "b", "c", "a",
"b", "c"), value = c(5, 4, 3, 10, 8, 2, 6, 5, 1, 11, 9, 4)), row.names = c(NA,
-12L), class = c("tbl_df", "tbl", "data.frame"))
我想迭代地将每个值除以分组变量每个级别中的特定行。这是一些示例数据:
library(tidyverse)
d <- structure(list(group = c("blue", "blue", "blue", "red", "red",
"red", "yellow", "yellow", "yellow", "green", "green", "green"
), level = c("a", "b", "c", "a", "b", "c", "a", "b", "c", "a",
"b", "c"), value = c(1.666667, 1.333333, 1, 5, 4, 1, 6, 5, 1, 2.75, 2.25, 1)), row.names = c(NA,
-12L), class = c("tbl_df", "tbl", "data.frame"))
d
# A tibble: 12 x 3
group level value
<chr> <chr> <dbl>
1 blue a 5
2 blue b 4
3 blue c 3
4 red a 10
5 red b 8
6 red c 2
7 yellow a 6
8 yellow b 5
9 yellow c 1
10 green a 11
11 green b 9
12 green c 4
所以,假设我想将每个组中找到的每个值除以 c 级别。在这种情况下,结果将如下所示:
result
# A tibble: 12 x 3
group level value
<chr> <chr> <dbl>
1 blue a 1.67
2 blue b 1.33
3 blue c 1
4 red a 5
5 red b 4
6 red c 1
7 yellow a 6
8 yellow b 5
9 yellow c 1
10 green a 2.75
11 green b 2.25
12 green c 1
有没有办法使用 tidyverse 功能来做到这一点?
假设level
在'group'中不重复,按'group'分组后,提取'c'对应的'value'( value[level == 'c']
) 并用它来划分 'value' 列
library(dplyr)
d %>%
group_by(group) %>%
mutate(value = value/value[level == 'c'])
# A tibble: 12 x 3
# Groups: group [4]
# group level value
# <chr> <chr> <dbl>
# 1 blue a 1.67
# 2 blue b 1.33
# 3 blue c 1
# 4 red a 5
# 5 red b 4
# 6 red c 1
# 7 yellow a 6
# 8 yellow b 5
# 9 yellow c 1
#10 green a 2.75
#11 green b 2.25
#12 green c 1
或者如果有多个'c',则使用match
获取'c'
d %>%
group_by(group) %>%
mutate(value = value/value[match('c', level)])
或使用base R
d$value <- d$value/with(subset(d, level == 'c'), setNames(value, group)[d$group])
数据
d <- structure(list(group = c("blue", "blue", "blue", "red", "red",
"red", "yellow", "yellow", "yellow", "green", "green", "green"
), level = c("a", "b", "c", "a", "b", "c", "a", "b", "c", "a",
"b", "c"), value = c(5, 4, 3, 10, 8, 2, 6, 5, 1, 11, 9, 4)), row.names = c(NA,
-12L), class = c("tbl_df", "tbl", "data.frame"))