取消聚合数据框

Luc*_*Pal 3 r dplyr

有很多类似的问题(例如,重复 data.frame 的每一行指定的次数在 R 中解聚合/反向汇总/扩展数据集在 dplyr 中重复 data.frame 的行),但是我的数据集的结构与这些问题的答案所假设的不同。

我有一个数据框,其中包含每个数据中的测量频率group以及每组每个结果的观察总数total_N

tibble(group=c("A", "B"), total_N=c(4,5), measure_A=c(1,4), measure_B=c(2,3))
# A tibble: 2 x 4
  group total_N outcome_A outcome_B
  <chr>   <dbl>     <dbl>     <dbl>
1 A           4         1         2
2 B           5         4         3
Run Code Online (Sandbox Code Playgroud)

我想对数据进行反聚合,以便数据框的行数与观察总数一样多,并且每个结果都有一个1用于所有带结果的观察值和一个0用于所有没有结果的观察值。因此最终结果应该是这样的数据框:

# A tibble: 9 x 3
  group outcome_A outcome_B
  <chr>     <dbl>     <dbl>
1 A             1         1
2 A             0         1
3 A             0         0
4 A             0         0
5 B             1         1
6 B             1         1
7 B             1         1
8 B             1         0
9 B             0         0
Run Code Online (Sandbox Code Playgroud)

由于聚合数据不包含有关 和 的组合频率(即相关性)的任何信息outcome_Aoutcome_B因此可以忽略。

Lim*_*mey 5

这是一个 tidyverse 解决方案。

\n

正如您所说,很容易重复一行任意次数。如果您知道row_number()对数据帧进行分组时对组内的行进行计数,则可以轻松将分组计数转换为存在/不存在标志。 across为您提供了一种简洁地转换多个计数列的方法。

\n
library(tidyverse)\n\ntibble(group=c("A", "B"), total_N=c(4,5), measure_A=c(1,4), measure_B=c(2,3)) %>% \n  uncount(total_N) %>% \n  group_by(group) %>% \n  mutate(\n    across(\n      starts_with("measure"), \n      function(x) as.numeric(row_number() <= x)\n    )\n  ) %>%\n  ungroup()\n# A tibble: 9 \xc3\x97 3\n  group measure_A measure_B\n  <chr>     <dbl>     <dbl>\n1 A             1         1\n2 A             0         1\n3 A             0         0\n4 A             0         0\n5 B             1         1\n6 B             1         1\n7 B             1         1\n8 B             1         0\n9 B             0         0\n
Run Code Online (Sandbox Code Playgroud)\n

正如您所说,这种方法没有考虑结果列之间的相关性,因为这无法从分组数据中推断出来。

\n