Подмножество столбцов для фиктивных переменных с использованием последней строки в случае связей - PullRequest
0 голосов
/ 11 июня 2019

У меня есть подмножество столбцов в моем фрейме данных, которые я хотел бы преобразовать в фиктивные переменные.

  1. Столбец с максимальным значением получает 1, а все остальные фиктивные переменные получают ноль.

  2. Если есть связь, то используйте фиктивную переменную кодирования предыдущих строк.

  set.seed(45)
  DF <- data.frame(matrix(sample(10, 26746*7, TRUE), ncol=7))
  df <- DF %>% rename(D1 = X2, D2 = X3, D3 = X4)
  head(df)
  X1 D1 D2 D3 X5  X6  X7
  2  2  2  10 10  1   2
  8  4  1  1  8   9   10
  3  4  2  3  9   2   9
  3  8  1  9  2   4   1
  3  1  8  1  5   4   8
  1  4  3  7  3   2   6

Ниже приведен кадр данных, где столбцы D являются подмножеством столбцов, которые я хотел бы преобразовать в фиктивные переменные.

  X1 D1 D2 D3 X5  X6  X7
  2  0  0  1  10  1   2
  8  1  0  0  8   9   10
  3  1  0  0  9   2   9
  3  0  0  1  2   4   1
  3  0  1  0  5   4   8
  1  0  0  1  3   2   6

Я бы предпочел решение data.table, но я также был бы рад базовому решению R или dplyr.

Ответы [ 2 ]

2 голосов
/ 11 июня 2019

Вот вариант:

library(zoo)
cols <- paste0("V", 2L:4L)
DT[, (cols) := {

    #set largest to 1 with first for ties
    m <- matrix(0L, .N, length(cols))
    m[cbind(seq_len(.N), max.col(.SD, "first"))] <- 1L

    #identify rows with dupes and set to NA
    idx <- apply(.SD, 1L, anyDuplicated) > 0L
    m[idx, seq_along(cols)] <- NA_integer_

    #fill NAs with previous row (if using data.table 1.12.3, there is a nafill function)
    as.data.table(zoo::na.locf(m))
}, .SDcols=cols]

хвост выхода:

    V1 V2 V3 V4 V5 V6 V7
 1:  5  0  0  1  6  3  2
 2:  8  0  0  1  4  6  3
 3:  4  0  1  0  7  8  1
 4:  8  1  0  0  5  3  2
 5:  6  1  0  0  4 10  7
 6:  9  1  0  0  5  7  3
 7:  3  0  1  0 10  3  2
 8:  5  1  0  0  9  8  2
 9:  6  0  1  0 10  3  9
10:  6  0  1  0  8  3  9

данные:

library(data.table)
set.seed(0L)
DT <- as.data.table(matrix(sample(10, 26746*7, TRUE), ncol=7))

хвост данных:

    V1 V2 V3 V4 V5 V6 V7
 1:  5  1  4  7  6  3  2
 2:  8  5  5  3  4  6  3
 3:  4  6  8  4  7  8  1
 4:  8  7  4  5  5  3  2
 5:  6 10 10  9  4 10  7
 6:  9  2  4  4  5  7  3
 7:  3  2  4  3 10  3  2
 8:  5 10  2  1  9  8  2
 9:  6  6  8  5 10  3  9
10:  6  5  8  7  8  3  9
0 голосов
/ 11 июня 2019

Ваше начальное семя не сработало для меня - в моем первом ряду был галстук, поэтому мое решение не сработало.

library(data.table)

set.seed(46) #changed
dt <- data.table(matrix(sample(10, 23746*7, TRUE), ncol = 7))
setnames(dt, c('V2', 'V3', 'V4'), c('D1', 'D2', 'D3'))

cols <- c('D1', 'D2', 'D3')

max_dt <- dt[, .(ID = 1:.N
                 ,max_col = apply(.SD, 1
                                  , function (x) {
                                    maxes <- which(x == max(x))
                                    ifelse((length(maxes) != 1), NA_integer_, maxes)
                                    }
                                  )
                 )
             , .SDcols = cols]

#Could still be a null in the first value - you'd have to determine what you want.
max_dt[, max_col := zoo::na.locf(max_col)]

max_dt

dcast(max_dt, ID ~ max_col, fun.aggregate = length, value.var = 'max_col', fill = 0)

dt[, (cols) := dcast(max_dt, ID ~ max_col, fun.aggregate = length, value.var = 'max_col', fill = 0 )[, -1]]
dt

До:

       V1 D1 D2 D3 V5 V6 V7
    1:  2  3  4  6  9  8  2
    2:  3  6  2  9  6  3  3
    3:  6  4  3  7  6  9 10
    4:  4  8  7 10  7  7 10
    5:  3  7 10  8  6  1  5
   ---                     
23742: 10  6  7 10  7  3  3
23743:  9  4 10  3  4  7  9
23744:  1  9  1  8 10  8  2
23745:  8  6  6  8  7  4  8
23746:  7  3  7  8  8 10  4

После:

       V1 D1 D2 D3 V5 V6 V7
    1:  2  0  0  1  9  8  2
    2:  3  0  0  1  6  3  3
    3:  6  0  0  1  6  9 10
    4:  4  0  0  1  7  7 10
    5:  3  0  1  0  6  1  5
   ---                     
23742: 10  0  0  1  7  3  3
23743:  9  0  1  0  4  7  9
23744:  1  1  0  0 10  8  2
23745:  8  0  0  1  7  4  8
23746:  7  0  0  1  8 10  4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...