Преобразование кадра данных в R - PullRequest
6 голосов
/ 30 марта 2011

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

V1 V2 V3 V4
xc ab ty ky
xc ab ty kj
xc yi tf kj
cv yi tf kj
bg yt tg kl
bg yu yu kl

конвертировать в

xc cv bg .....
T  F  F......
T  F  F....
T  F  F....
F  T  F....
F  F  T...
F  F  T....

я пытался

newframe <- transform(oldframe, xc = to_column(oldframe$V1,'xc')) 

где к столбцу

to_column = function(col, val){
    if (col == val)
        'TRUE'  else
        'FALSE' }

Ответы [ 4 ]

7 голосов
/ 31 марта 2011

Это один из стандартных подходов к созданию фиктивных переменных из категориальной переменной:

model.matrix( ~ V1 - 1, data=df)

df - это ваш data.frame, как показано в вашем вопросе.Это возвращает двоичный 0/1 как ЛОЖЬ / ИСТИНА.Надеюсь, это поможет!

С наилучшими пожеланиями,

Jay

5 голосов
/ 31 марта 2011

Опираясь на ответ @ Джея, мы имеем это в качестве логической матрицы.

Версия логической матрицы:

out <- model.matrix( ~ V1 - 1, data=dat)
out <- matrix(as.logical(out), ncol = ncol(out))
colnames(out) <- with(dat, levels(V1))

> out
        bg    cv    xc
[1,] FALSE FALSE  TRUE
[2,] FALSE FALSE  TRUE
[3,] FALSE FALSE  TRUE
[4,] FALSE  TRUE FALSE
[5,]  TRUE FALSE FALSE
[6,]  TRUE FALSE FALSE

Все переменные одновременно версия:

out2 <- sapply(dat, function(x) model.matrix( ~ x - 1))
out2 <- do.call(cbind, out2)
out2 <- matrix(as.logical(out2), ncol = ncol(out2))
colnames(out2) <- unlist(sapply(dat, levels))

> out2
        bg    cv    xc    ab    yi    yt    yu    tf    tg    ty
[1,] FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
[2,] FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
[3,] FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE
[4,] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE
[5,]  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
[6,]  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
        yu    kj    kl    ky
[1,] FALSE FALSE FALSE  TRUE
[2,] FALSE  TRUE FALSE FALSE
[3,] FALSE  TRUE FALSE FALSE
[4,] FALSE  TRUE FALSE FALSE
[5,] FALSE FALSE  TRUE FALSE
[6,]  TRUE FALSE  TRUE FALSE

Если вы не хотите использовать его в качестве полной матрицы, как описано выше, вы можете остановиться на первой строке, в которой есть все матрицы моделей в списке, по одной для каждой переменной (столбца) в dat, и преобразовать логично. Этот однострочник делает оба шага:

> lapply(lapply(dat, function(x) model.matrix( ~ x - 1)),
+        function(x) matrix(as.logical(x), ncol = ncol(x)))
$V1
      [,1]  [,2]  [,3]
[1,] FALSE FALSE  TRUE
[2,] FALSE FALSE  TRUE
[3,] FALSE FALSE  TRUE
[4,] FALSE  TRUE FALSE
[5,]  TRUE FALSE FALSE
[6,]  TRUE FALSE FALSE

$V2
      [,1]  [,2]  [,3]  [,4]
[1,]  TRUE FALSE FALSE FALSE
[2,]  TRUE FALSE FALSE FALSE
[3,] FALSE  TRUE FALSE FALSE
[4,] FALSE  TRUE FALSE FALSE
[5,] FALSE FALSE  TRUE FALSE
[6,] FALSE FALSE FALSE  TRUE

$V3
      [,1]  [,2]  [,3]  [,4]
[1,] FALSE FALSE  TRUE FALSE
[2,] FALSE FALSE  TRUE FALSE
[3,]  TRUE FALSE FALSE FALSE
[4,]  TRUE FALSE FALSE FALSE
[5,] FALSE  TRUE FALSE FALSE
[6,] FALSE FALSE FALSE  TRUE

$V4
      [,1]  [,2]  [,3]
[1,] FALSE FALSE  TRUE
[2,]  TRUE FALSE FALSE
[3,]  TRUE FALSE FALSE
[4,]  TRUE FALSE FALSE
[5,] FALSE  TRUE FALSE
[6,] FALSE  TRUE FALSE

И если имена переменных важны, тогда мы можем изменить это на

foo <- function(x) {
    mat <- matrix(as.logical(x), ncol = ncol(x))
    colnames(mat) <- levels(x)
    mat
}
lapply(lapply(dat, function(x) model.matrix( ~ x - 1)), foo)
1 голос
/ 02 января 2015

Это довольно просто с mtabulate из пакета "qdap":

library(qdap)
mtabulate(split(mydf, 1:nrow(mydf))) > 0
#      ab    bg    cv    kj    kl    ky    tf    tg    ty    xc    yi
# 1  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE
# 2  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE
# 3 FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE
# 4 FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE
# 5 FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE
# 6 FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
#      yt    yu
# 1 FALSE FALSE
# 2 FALSE FALSE
# 3 FALSE FALSE
# 4 FALSE FALSE
# 5  TRUE FALSE
# 6 FALSE  TRUE

По умолчанию mtabulate будет сводить в таблицу результаты (сюрприз!), Поэтому результатом будет числовое значение data.frame. Например, вы увидите, что счетчик «yu» в строке 6 на самом деле равен 2. Чтобы получить желаемый результат logical (только присутствие / отсутствие), просто сравните значения, полученные из mtabulate, с нулем.

1 голос
/ 31 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...