R объединяет два фактора - PullRequest
13 голосов
/ 22 ноября 2011

Это заставляет меня чувствовать себя глупым, но я пытаюсь создать один вектор / df / list / etc (что угодно, кроме матрицы), объединяющий два фактора.Вот сценарий.У меня есть набор данных линии 100 КБ.Я использовал верхнюю половину, чтобы предсказать нижнюю половину, и наоборот, используя knn.Итак, теперь у меня есть 2 объекта, созданных knn predict().

> head(pred11)
[1] 0 0 0 0 0 0
Levels: 0 1
> head(pred12)
[1] 0 1 1 0 0 0
Levels: 0 1
> class(pred11)
[1] "factor"
> class(pred12)
[1] "factor"

Вот где начинается моя проблема:

> pred13 <- rbind(pred11, pred12)
> class(pred13)
[1] "matrix"

Есть 2 проблемы.Сначала он меняет 0 и 1 на 1 и 2, а во-вторых, создается огромная матрица, которая съедает всю мою память.Я пробовал возиться с as.numeric(), data.frame() и т. Д., Но не могу заставить его просто объединить 2 коэффициента 50k в 1 100k.Есть предложения?

Ответы [ 2 ]

28 голосов
/ 22 ноября 2011

@ Джеймс представил один способ, я добавлю другой (короче):

set.seed(42)
x1 <- factor(sample(0:1,10,replace=T))
x2 <- factor(sample(0:1,10,replace=T))

unlist(list(x1,x2))
# [1] 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1
#Levels: 0 1

... Это может показаться магией, но unlist имеет особую поддержку факторов для этой конкретной цели! Все элементы в списке должны быть факторами, чтобы это работало.

18 голосов
/ 22 ноября 2011

rbind создаст матрицу 2 x 50000 в вашем случае, а это не то, что вам нужно. c - правильная функция для объединения 2 векторов в один более длинный вектор. Когда вы используете rbind или c для фактора, он будет использовать базовые целые числа, которые отображаются на уровни. В общем случае перед рефакторингом вам нужно объединить персонажа:

x1 <- factor(sample(0:1,10,replace=T))
x2 <- factor(sample(0:1,10,replace=T))

factor(c(as.character(x1),as.character(x2)))
 [1] 1 1 1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 0 0 0
Levels: 0 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...