[英]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 功能來做到這一點?
假設'group'內的level
沒有重復,按'group'分組后,提取'c'級別對應的'value'( value[level == 'c']
)並用它來划分'值”列
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"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.