找出两组之间的比率

Wil*_* M. 4 grouping r dataframe dplyr

本质上我有

Var1 Group Value
a    0     1 
b    0     2
c    0     3
a    1     2
b    1     10
c    1     9
Run Code Online (Sandbox Code Playgroud)

我想计算一个包含行Var1和单列的表Div,其中对于 的任何值Var1, 的值Div将是Value组 1 的值除以组 2 的值。因此,结果应该是

Var1 Div
a    .5
b    .2
c    .3333
Run Code Online (Sandbox Code Playgroud)

我通过创建两个表来实现这一点(使用 过滤表Group,然后划分Value两个表的列,然后创建一个新表)。tidyverse 中是否有使用管道实现此目的的方法或函数?

r2e*_*ans 5

library(dplyr)\nquux %>%\n  group_by(Var1) %>%\n  filter(all(0:1 %in% Group)) %>%\n  summarize(Div = Value[Group==0]/Value[Group==1])\n# # A tibble: 3 \xc3\x97 2\n#   Var1    Div\n#   <chr> <dbl>\n# 1 a     0.5  \n# 2 b     0.2  \n# 3 c     0.333\n
Run Code Online (Sandbox Code Playgroud)\n

的使用filter(all(0:1 %in% Group))是按组进行的,并确保我们同时拥有两者才能完成比率。(根据您对数据的信心,稍微复杂一点的测试是保证其中每个恰好都有一个0:1,也许使用

\n
quux %>%\n  group_by(Var1) %>%\n  filter(identical(sort(intersect(Group, 0:1)), 0:1)) %>%\n  summarize(...)\n
Run Code Online (Sandbox Code Playgroud)\n

这保证了两个人都在 中,并且没有其他人在 中Group。(保障数据完整性。)

\n

但是,如果您需要保留这些组,或者Group您认为一个组中的每个组很可能有多个Var1,那么您可以执行以下操作:

\n
quux %>%\n  group_by(Var1) %>%\n  summarize(Div = Value[Group==0][1]/Value[Group==1][1])\n# # A tibble: 3 \xc3\x97 2\n#   Var1    Div\n#   <chr> <dbl>\n# 1 a     0.5  \n# 2 b     0.2  \n# 3 c     0.333\n
Run Code Online (Sandbox Code Playgroud)\n

添加[1]保证我们只会得到一个值;如果Group找到了,那么它就是相应的Value;但是,如果Group没有找到Value[Group==0][1]将返回NA,这对于分子和分母来说都是安全的。

\n
\n

数据

\n
quux <- structure(list(Var1 = c("a", "b", "c", "a", "b", "c"), Group = c(0L, 0L, 0L, 1L, 1L, 1L), Value = c(1L, 2L, 3L, 2L, 10L, 9L)), class = "data.frame", row.names = c(NA, -6L))\n
Run Code Online (Sandbox Code Playgroud)\n