有很多类似的问题(例如,重复 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_A,outcome_B因此可以忽略。
这是一个 tidyverse 解决方案。
\n正如您所说,很容易重复一行任意次数。如果您知道row_number()对数据帧进行分组时对组内的行进行计数,则可以轻松将分组计数转换为存在/不存在标志。 across为您提供了一种简洁地转换多个计数列的方法。
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\nRun Code Online (Sandbox Code Playgroud)\n正如您所说,这种方法没有考虑结果列之间的相关性,因为这无法从分组数据中推断出来。
\n