簡體   English   中英

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 功能來做到這一點?

假設'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM