Подтвердить что ты не робот

R, объединяющий два фактора

Это заставляет меня чувствовать себя глупым, но я пытаюсь создать один вектор /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 50 тыс. Факторов в 1 100 тыс. Единиц. Любые предложения?

4b9b3361

Ответ 1

rbind создаст в вашем случае 2 x 50000 матрицу, которая вам не нужна. c - правильная функция для объединения двух векторов в один длинный вектор. Когда вы используете коэффициент 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

Ответ 2

@James представил один из способов: я почищу еще один (короче):

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 имеет особую поддержку факторов для этой конкретной цели! Все элементы в списке должны быть факторами для этого.