2016-12-26 7 views
2

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

Вот MWE:

a <- data.frame(dummy=1:5, stringsAsFactors = TRUE) 
b <- as.factor(c("Monday", "Tuesday", "Monday", "Thursday", "Tuesday")) 
a["d"] <- b 

> levels(a["d"]) 
NULL 

Как выполнить задание таким образом я получаю реальный фактор, сохраняя исходные уровни?

Важно, чтобы я не мог использовать решения, которые впоследствии преобразуют фактор, потому что в этом примере он получит уровни «понедельник четверг вторник», в то время как я подготовил фактор, который имеет все надлежащие уровни и в нужной последовательности (в этом примере это будут все дни недели подряд).

ответ

5

Это связано с различием в извлечении столбцов. a['d'] еще data.frame с «D» в колонке, в то время как a[, 'd'] или a[['d']] или a$d все извлекает столбец «D» в качестве vector с class как factor. Чтобы увидеть разницу, мы проверим str()

str(a['d']) 
#'data.frame': 5 obs. of 1 variable: 
#$ d: Factor w/ 3 levels "Monday","Thursday",..: 1 3 1 2 3 

str(a[['d']]) 
#Factor w/ 3 levels "Monday","Thursday",..: 1 3 1 2 3 

levels(a["d"]) 
#NULL 

levels(a[["d"]]) 
#[1] "Monday" "Thursday" "Tuesday"