Как получить доступ к фактической хэш-таблице поиска внутренних факторов в R
Уважаемое сообщество Stackru,
Я искал везде, но не могу найти ответ на этот вопрос. Я пытаюсь получить доступ к таблице поиска факторов, которую R использует, когда вы изменяете вектор строки на вектор факторов. Я не пытаюсь преобразовать строку в фактор, а хочу получить справочную таблицу, лежащую в основе переменной фактора, и сохранить ее как хеш-таблицу для использования в другом месте.
Я столкнулся с проблемой, потому что я хочу использовать эту таблицу поиска факторов в списке векторов различной длины, чтобы преобразовать их из строк в числа.
у меня есть список наборов элементов, которые я хочу преобразовать в числовые, но каждый набор в списке имеет разное количество элементов.
Пока что я преобразовал список векторов в вектор
vec <- unlist(list)
vec <- factor(vec)
Теперь я хочу выполнить поиск в исходном списке с помощью таблицы поиска факторов, которая должна лежать в основе vec, но я не могу найти ее.
1 ответ
Я думаю, что вы либо хотите индексы, которые отображают элементы фактора на элементы уровней фактора, как в:
vec <- c('a','b','c','b','a')
f <- factor(vec)
f
#> [1] a b c b a
#> Levels: a b c
indx <- (f)
attributes(indx) <- NULL
indx
#> [1] 1 2 3 2 1
или вы хотите, чтобы хеш-таблицы использовались внутренне для создания факторной переменной. К сожалению, любые хеш-таблицы, созданные в процессе создания фактора, будут созданы функциями unique
а также match
которые являются внутренними функциями, поэтому у вас не будет доступа ни к чему, создаваемому этими функциями (конечно, кроме возвращаемого значения). Если вам нужна хеш-таблица, чтобы вы могли использовать ее для индексирования вектора символов с теми же уровнями, что и у существующего фактора, просто создайте хеш-таблицу, как показано в:
library(hash)
.levels <- levels(f)
h <- hash(keys = .levels,values = seq_along(.levels))
newVec <- sample(.levels,10,replace=T)
newVec
#> [1] "a" "b" "a" "a" "a" "c" "c" "b" "c" "a"
values(h,keys = newVec)
#> a b a a a c c b c a
#> 1 2 1 1 1 3 3 2 3 1