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 中是否有使用管道实现此目的的方法或函数?
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\nRun Code Online (Sandbox Code Playgroud)\n的使用filter(all(0:1 %in% Group))是按组进行的,并确保我们同时拥有两者才能完成比率。(根据您对数据的信心,稍微复杂一点的测试是保证其中每个恰好都有一个0:1,也许使用
quux %>%\n group_by(Var1) %>%\n filter(identical(sort(intersect(Group, 0:1)), 0:1)) %>%\n summarize(...)\nRun Code Online (Sandbox Code Playgroud)\n这保证了两个人都在 中,并且没有其他人在 中Group。(保障数据完整性。)
但是,如果您需要保留这些组,或者Group您认为一个组中的每个组很可能有多个Var1,那么您可以执行以下操作:
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\nRun Code Online (Sandbox Code Playgroud)\n添加[1]保证我们只会得到一个值;如果Group找到了,那么它就是相应的Value;但是,如果Group没有找到,Value[Group==0][1]将返回NA,这对于分子和分母来说都是安全的。
数据
\nquux <- 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))\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |