R - 根据 B 列中的两个水平,通过 A 列分组,使 C 列中两个变量的比率

R - Make the ratio of two variables in column C, based on two levels in colum B, by gruping of column A

如标题,尝试根据它们在其他两列中的分组来计算一列中两个变量的比率。

colA colB colC
a1   b_1  24
a1   b_2  26
a2   b_1  12
a2   b_2  14
a3   b_1  19
a3   b_2  21

我需要的是一个比率介于 b_1/b_2 之间的新列,按 colA

分组
   colA colB colC  colD
    a1   b_1  24   26/24
    a1   b_2  26    
    a2   b_1  12   14/12
    a2   b_2  14   
    a3   b_1  19   21/19
    a3   b_2  21

我正在尝试使用 dplyr,但我仍然做不到

df %>% select(colA, colB, colC) %>%
   group_by(colA,colB) %>%
   mutate(ratio,  ???????

此外,我需要为 a1_b_1、colC 除以所有其他 a*_b_1、colC 计算 colC 值的比率,对于 a1_b2_colC 除以所有其他 a* _b_2_colC

   colA colB colC  colD
    a1   b_1  24   
    a1   b_2  26    
    a2   b_1  12  
    a2   b_2  14   
    a3   b_1  19   
    a3   b_2  21

给定一个小标题 df,您可以通过调用 dput

获得
df = tibble::tribble(
  ~colA, ~colB, ~colC,
   "a1","b_1", 24,
   "a1","b_2", 26,
   "a2","b_1", 12,
   "a2","b_2", 14,
   "a3","b_1", 19,
   "a3","b_2", 21)

我们可以按照问题中使用的逻辑进行操作:

df %>%
  group_by(colA) %>%
  mutate(ColD = c(colC[2] / colC[1], NA)) %>%
  ungroup()

# A tibble: 6 x 4
  colA  colB   colC  ColD
  <chr> <chr> <dbl> <dbl>
1 a1    b_1      24  1.08
2 a1    b_2      26 NA   
3 a2    b_1      12  1.17
4 a2    b_2      14 NA   
5 a3    b_1      19  1.11
6 a3    b_2      21 NA  

使用 base R,这个 one-liner 会给你比率。

df <- do.call(rbind, lapply(split(df, df$colA), function(x) cbind(x, colD = x[2, 'colC'] / x[1, 'colC'])))

输出

> df
     colA colB colC     colD
a1.1   a1  b_1   24 1.083333
a1.2   a1  b_2   26 1.083333
a2.3   a2  b_1   12 1.166667
a2.4   a2  b_2   14 1.166667
a3.5   a3  b_1   19 1.105263
a3.6   a3  b_2   21 1.105263

数据

df <- data.frame(
  colA = rep(paste0('a', 1:3), each = 2L),
  colB = rep(paste0('b_', 1:2), 3L),
  colC = c(24,26,12,14,19,21)
)