Разделить сгруппированные биномиальные данные в r - PullRequest
0 голосов
/ 13 октября 2018

У меня есть данные, которые выглядят так:

samplesize <- 6

group <- c(1,2,3)
total <- rep(samplesize,length(group))
outcomeTrue <- c(2,1,3)

df <- data.frame(group,total,outcomeTrue)

, и я хотел бы, чтобы мои данные выглядели так

group2 <- c(rep(1,6),rep(2,6),rep(3,6))
outcomeTrue2 <- c(rep(1,2),rep(0,6-2),rep(1,1),rep(0,6-1),rep(1,3),rep(0,6-3))

df2 <- data.frame(group2,outcomeTrue2)

То есть у меня есть двоичные данные, где мне сообщаютсуммарные наблюдения и успешные наблюдения, но предпочли бы, чтобы они были организованы в виде отдельных наблюдений с их явным результатом, равным 0 или 1. т. е. Визуальный пример желаемого результата

Существует ли простой способсделать это в г, или мне нужно будет написать цикл, чтобы автоматизировать это сам?

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Вот базовое решение R.

do.call(rbind, lapply(split(df, df$group), function(x) data.frame(group2 = x$group, outcome2 = rep(c(1,0), times = c(x$outcome, x$total-x$outcome)))))

#     group2 outcome2
# 1.1      1        1
# 1.2      1        1
# 1.3      1        0
# 1.4      1        0
# 1.5      1        0
# 1.6      1        0
# 2.1      2        1
# 2.2      2        0
# 2.3      2        0
# 2.4      2        0
# 2.5      2        0
# 2.6      2        0
# 3.1      3        1
# 3.2      3        1
# 3.3      3        1
# 3.4      3        0
# 3.5      3        0
# 3.6      3        0
0 голосов
/ 13 октября 2018

Вот один вариант с tidyverrse.Мы uncount расширяем строки, используя столбец «total», сгруппированный по «group», создаем двоичный индекс с логическим условием, основанным на row_number() и значении «resultTrue»

library(tidyverse)
df %>% 
   uncount(total) %>% 
   group_by(group) %>%
   mutate(outcomeTrue = as.integer(row_number() <= outcomeTrue[1]))
# A tibble: 18 x 2
# Groups:   group [3]
#   group outcomeTrue
#   <dbl>       <int>
# 1     1           1
# 2     1           1
# 3     1           0
# 4     1           0
# 5     1           0
# 6     1           0
# 7     2           1
# 8     2           0
# 9     2           0
#10     2           0
#11     2           0
#12     2           0
#13     3           1
#14     3           1
#15     3           1
#16     3           0
#17     3           0
#18     3           0
0 голосов
/ 13 октября 2018

Вы тоже там.просто используйте переменную группы 2 с функцией «[» в позиции x:

df[ group2 , ]
    group total outcomeTrue
1       1     6           2
1.1     1     6           2
1.2     1     6           2
1.3     1     6           2
1.4     1     6           2
1.5     1     6           2
2       2     6           1
2.1     2     6           1
2.2     2     6           1
2.3     2     6           1
2.4     2     6           1
2.5     2     6           1
3       3     6           3
3.1     3     6           3
3.2     3     6           3
3.3     3     6           3
3.4     3     6           3
3.5     3     6           3

Когда число или символьное значение, совпадающее с rowname, помещается в позицию x «[»реплицирует всю строку

...