как эффективно разделить фрейм данных на несколько блоков, которые будут переданы в список списков - PullRequest
0 голосов
/ 22 января 2019

Буду признателен за любую помощь для эффективного разбиения фрейма данных на несколько фрагментов, которые будут переданы в список списков на основе переменной imput.

Мой код ниже работает для нескольких подмножеств, но у меня есть 100 подмножеств для создания, и код становится слишком большим и трудным для обработки. Поэтому мне нужен более эффективный подход, который позволяет достичь того же результата без большого количества кода.

Подход imputation_groups <- split(dat, dat$imput), обсуждаемый здесь , позволяет мне разбить мои данные на список из нескольких кусков (фреймов данных) на основе imput, но я хочу иметь возможность впоследствии извлекать переменные из каждого из чанки, чтобы создать список из каждого чанка, а затем список этих списков. Кроме того, я не уверен, как создать переменную N <- nrow(dT_P1), N <- nrow(dT_P2), N <- nrow(dT_P3), N <- nrow(dT_P4), N <- nrow(dT_P5) для каждого из списков, созданных для каждого из блоков.

мои данные:

dat <- structure(list(id = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 
3, 3, 4, 4, 4, 4, 4), imput = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 
1, 2, 3, 4, 5, 1, 2, 3, 4, 5), A = c(1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), B = c(1, 1, 1, 1, 1, 0, 
0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0), Pass = c(278, 278, 
278, 278, 278, 100, 100, 100, 100, 100, 153, 153, 153, 153, 153, 
79, 79, 79, 79, 79), Fail = c(740, 743, 742, 743, 740, 7581, 
7581, 7581, 7581, 7581, 1231, 1232, 1235, 1235, 1232, 1731, 1732, 
1731, 1731, 1731), Weights_1 = c(4, 3, 4, 3, 3, 1, 2, 1, 2, 1, 
12, 12, 11, 12, 12, 3, 5, 3, 3, 3), Weights_2 = c(3, 3, 3, 3, 
3, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, 3, 3, 3, 3, 3), Weights_3 = c(4, 
3, 3, 3, 3, 1, 2, 1, 1, 1, 12, 12, 11, 12, 12, 3, 3, 3, 3, 3), 
    Weights_4 = c(3, 3, 4, 3, 3, 1, 1, 1, 2, 1, 12, 12, 13, 12, 
    12, 3, 2, 3, 3, 3), Weights_5 = c(3, 3, 3, 3, 3, 1, 0, 1, 
    1, 1, 12, 12, 12, 12, 12, 3, 3, 3, 3, 3), Weights_6 = c(4, 
    3, 3, 3, 3, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, 3, 3, 3, 3, 
    3), Weights_7 = c(3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 12, 12, 12, 
    12, 12, 3, 3, 3, 3, 3), Weights_8 = c(3, 3, 3, 3, 3, 1, 1, 
    1, 1, 1, 15, 12, 12, 12, 12, 3, 3, 3, 3, 3), Weights_9 = c(3, 
    3, 3, 4, 3, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, 2, 3, 3, 3, 
    3), Weights_10 = c(3, 3, 4, 3, 3, 1, 1, 1, 1, 1, 12, 10, 
    12, 12, 12, 3, 3, 3, 3, 3)), class = "data.frame", row.names = c(NA, 
-20L))

мой подход:

##subsetting based on `imput`

    ##imput = `1`
    dT_P1<- dat[dat$imput == '1',]

    N <- nrow(dT_P1)
    C <-ncol(dT_P1)
    ncases <- dT_P1$Pass
    nn <- dT_P1$Fail + dT_P1$Pass
    A <- dT_P1$A
    B <- dT_P1$B
    id <- dT_P1$id
    imput <- dT_P1$imput
    w_1 <- dT_P1$Weights_1
    w_2 <- dT_P1$Weights_2
    w_3 <- dT_P1$Weights_3
    w_4 <- dT_P1$Weights_4
    w_5 <- dT_P1$Weights_5
    w_6 <- dT_P1$Weights_6
    w_7 <- dT_P1$Weights_7
    w_8 <- dT_P1$Weights_8
    w_9 <- dT_P1$Weights_9
    w_10 <- dT_P1$Weights_10

    dat1 <- list (N = N, 
              ncases = ncases, A = A, B = B, id = id, P = imput, nn = nn,
              weights = cbind(w_1, w_2, w_3, w_4, w_5, w_6, w_7, w_8, w_9, w_10))


    ##imput = `2`
    dT_P2<- dat[dat$imput == '2',]

    N <- nrow(dT_P2)
    C <-ncol(dT_P2)
    ncases <- dT_P2$Pass
    nn <- dT_P2$Fail + dT_P2$Pass
    A <- dT_P2$A
    B <- dT_P2$B
    id <- dT_P2$id
    imput <- dT_P2$imput
    w_1 <- dT_P2$Weights_1
    w_2 <- dT_P2$Weights_2
    w_3 <- dT_P2$Weights_3
    w_4 <- dT_P2$Weights_4
    w_5 <- dT_P2$Weights_5
    w_6 <- dT_P2$Weights_6
    w_7 <- dT_P2$Weights_7
    w_8 <- dT_P2$Weights_8
    w_9 <- dT_P2$Weights_9
    w_10 <- dT_P2$Weights_10

    dat2 <- list (N = N, 
              ncases = ncases, A = A, B = B, id = id, P = imput, nn = nn,
              weights = cbind(w_1, w_2, w_3, w_4, w_5, w_6, w_7, w_8, w_9, w_10))

    ##imput = `3`
    dT_P3<- dat[dat$imput == '3',]

    N <- nrow(dT_P3)
    C <-ncol(dT_P3)
    ncases <- dT_P3$Pass
    nn <- dT_P3$Fail + dT_P3$Pass
    A <- dT_P3$A
    B <- dT_P3$B
    id <- dT_P3$id
    imput <- dT_P3$imput
    w_1 <- dT_P3$Weights_1
    w_2 <- dT_P3$Weights_2
    w_3 <- dT_P3$Weights_3
    w_4 <- dT_P3$Weights_4
    w_5 <- dT_P3$Weights_5
    w_6 <- dT_P3$Weights_6
    w_7 <- dT_P3$Weights_7
    w_8 <- dT_P3$Weights_8
    w_9 <- dT_P3$Weights_9
    w_10 <- dT_P3$Weights_10

    dat3 <- list (N = N, 
              ncases = ncases, A = A, B = B, id = id, P = imput, nn = nn,
              weights = cbind(w_1, w_2, w_3, w_4, w_5, w_6, w_7, w_8, w_9, w_10))

    ##imput = `4`
    dT_P4<- dat[dat$imput == '4',]

    N <- nrow(dT_P4)
    C <-ncol(dT_P4)
    ncases <- dT_P4$Pass
    nn <- dT_P4$Fail + dT_P4$Pass
    A <- dT_P4$A
    B <- dT_P4$B
    id <- dT_P4$id
    imput <- dT_P4$imput
    w_1 <- dT_P4$Weights_1
    w_2 <- dT_P4$Weights_2
    w_3 <- dT_P4$Weights_3
    w_4 <- dT_P4$Weights_4
    w_5 <- dT_P4$Weights_5
    w_6 <- dT_P4$Weights_6
    w_7 <- dT_P4$Weights_7
    w_8 <- dT_P4$Weights_8
    w_9 <- dT_P4$Weights_9
    w_10 <- dT_P4$Weights_10

    dat4 <- list (N = N, 
              ncases = ncases, A = A, B = B, id = id, P = imput, nn = nn,
              weights = cbind(w_1, w_2, w_3, w_4, w_5, w_6, w_7, w_8, w_9, w_10))

    ##imput = `5`
    dT_P5<- dat[dat$imput == '5',]

    N <- nrow(dT_P5)
    C <-ncol(dT_P5)
    ncases <- dT_P5$Pass
    nn <- dT_P5$Fail + dT_P5$Pass
    A <- dT_P5$A
    B <- dT_P5$B
    id <- dT_P5$id
    imput <- dT_P5$imput
    w_1 <- dT_P5$Weights_1
    w_2 <- dT_P5$Weights_2
    w_3 <- dT_P5$Weights_3
    w_4 <- dT_P5$Weights_4
    w_5 <- dT_P5$Weights_5
    w_6 <- dT_P5$Weights_6
    w_7 <- dT_P5$Weights_7
    w_8 <- dT_P5$Weights_8
    w_9 <- dT_P5$Weights_9
    w_10 <- dT_P5$Weights_10

    dat5 <- list (N = N, 
              ncases = ncases, A = A, B = B, id = id, P = imput, nn = nn,
              weights = cbind(w_1, w_2, w_3, w_4, w_5, w_6, w_7, w_8, w_9, w_10))

##creating the list of lists:

    mydatalist <- list(dat1, dat2, dat3, dat4, dat5) 

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Многократное повторение вещей не соответствует духу программирования. Если вы недостаточно изучили функции в R, вы можете попробовать цикл for, чтобы добиться этого. Вот метод by(). Эта функция представляет собой смесь split() и lapply().

mylist <- by(dat, dat$imput, function(x){
  nn <- x$Fail + x$Pass
  weights <- x[paste0("Weights_", 1:10)]
  names(weights) <- paste0("w_", 1:10)
  return(list(N = nrow(x), ncases = x$Pass, A = x$A, B = x$B,
              id = x$id, P = x$imput, nn = nn, weights = weights))
})
0 голосов
/ 22 января 2019

вы можете:

  1. сначала вы разделите свой data.frame, используя split
  2. , а затем используйте lapply, чтобы применить функцию к вашему списку подмножеств

вот пример

l <- split(dat, dat$imput)
fun <- function(x) {
  w <- x[, grep('Weights', colnames(x))]
  colnames(w) <- paste0('w_', 1:10)
  w <- data.matrix(w)
  return(list(N = nrow(x),
              C = ncol(x),
              ncases = x$Pass,
              A = x$A,
              B = x$B,
              id = x$id,
              P = x$imput,
              nn = x$Fail + x$Pass,
              weights = w))
}
mydatalist <- lapply(l, fun)
...