Создание таблицы с отдельными испытаниями из таблицы частот в R (обратная функция таблицы)

У меня есть таблица частот данных в data.frame в R, где перечислены уровни факторов и количество успехов и неудач. Я хотел бы превратить его из таблицы частот в список событий, т.е. напротив команды "таблица". В частности, я хотел бы повернуть это:

factor.A factor.B success.count fail.count
-------- -------- ------------- ----------
 0        1        0             2
 1        1        2             1

в это:

factor.A factor.B result 
-------- -------- -------
 0        1        0
 0        1        0
 1        1        1
 1        1        1
 1        1        0

Мне кажется, что это должна делать reshape, или еще какая-то непонятная базовая функция, о которой я не слышал, но мне не повезло. Даже повторение отдельных строк data.frame сложно — как передать переменное количество аргументов rbind?

Советы?

Предыстория: Почему? Потому что легче перекрестно проверить логистические соответствия такому набору данных, чем агрегированные биномиальные данные.

Я анализирую свою обобщенную линейную модель как биномиальную регрессию в R и хотел бы провести перекрестную проверку, чтобы контролировать регуляризацию моих данных, поскольку моя цель - прогнозировать.

Однако, насколько я могу судить, процедуры перекрестной проверки по умолчанию в R не подходят для биномиальных данных, просто пропуская целые строки таблицы частот, а не испытания по отдельности. Это означает, что комбинации факторов с малой и большой выборкой имеют одинаковый вес в моей функции затрат, что не подходит для моих данных.


person dan mackinlay    schedule 02.04.2014    source источник
comment
Хм, на самом деле, теперь я думаю об этом, здесь достаточно мало статистического контента, чтобы это могло перейти прямо к stackoverflow как к обычному вопросу программирования.   -  person dan mackinlay    schedule 03.04.2014
comment
Верно, но пожалуйста, не делайте кросспост. Мы перенесем это для вас.   -  person gung - Reinstate Monica    schedule 03.04.2014


Ответы (3)


Вы можете попробовать это:

# create 'result' vector
# repeat 1s and 0s the number of times given in the respective 'count' column
result <- rep(rep(c(1, 0), nrow(df)), unlist(df[ , c("success.count", "fail.count")]))

# repeat each row in df the number of times given by the sum of 'count' columns
data.frame(df[rep(1:nrow(df), rowSums(df[ , c("success.count", "fail.count")]) ), c("factor.A", "factor.B")], result)

#     factor.A factor.B result
# 1          0        1      0
# 1.1        0        1      0
# 2          1        1      1
# 2.1        1        1      1
# 2.2        1        1      0
person Henrik    schedule 02.04.2014

Попробуй это

  x = matrix( c(0, 1, 1, 1, 0 , 2, 2, 1), 2, 4)
  r= c()
  for(i in 1:nrow(x)) {
    r = c(r, rep(c(x[i, 1:2], 1), x[i, 3]))
    r = c(r, rep(c(x[i, 1:2], 0), x[i, 4]))
  }
  t(matrix(r, nrow= 3))
person phi    schedule 02.04.2014

Для решения в стиле tidyverse вы можете сделать

library(tidyverse)

df %>% gather(key = result, value = incidence, success.count, fail.count) %>% 
     mutate(result = if_else(result %>% str_detect("success"), 1, 0)) %>%
     pmap_dfr(function(factor.A, factor.B, result, incidence) 
                   { tibble(factor.A = factor.A,
                            factor.B = factor.B,
                            result = rep(result, times = incidence)
                            )
                   }
               )
person Tom Greenwood    schedule 12.11.2018