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)
)
如标题,尝试根据它们在其他两列中的分组来计算一列中两个变量的比率。
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)
)