2015-12-16 12 views
5

Nie wiem, dlaczego walczę z tym, ponieważ wydaje się, że istnieje wiele odpowiedzi na SO, które rozwiązują to pytanie. Ale oto jestem.współczynnik konwersji do oryginalnej wartości liczbowej

Konwertuję wektor 1 i 0 na współczynnik i oznaczam wartości "tak" i "nie".

fact <- factor(c(1,1,0,1,0,1), 
       levels=c(1,0), 
       labels=c("yes", "no")) 
#[1] yes yes no yes no yes 
#Levels: yes no 

Odpowiedzi na pytania dotyczące czynników konwersji z powrotem do wartości liczbowe wskazują as.numeric(as.character(x)) i as.numeric(levels(x)[x].

as.numeric(as.character(fact)) 
#[1] NA NA NA NA NA NA 

as.numeric(levels(fact))[fact] 
#[1] NA NA NA NA NA NA 
+1

Myślę, że najlepszym rozwiązaniem byłoby, aby utworzyć inny obiekt przed zmianą to czynnik klasę. tj. "v1 <- c (1,1,0,1,0,1); fact <- factor (v1, levels = c (1,0), labels = c ("yes", "no")); unique (v1) [as.numeric (fact)] ' – akrun

+4

Po zmianie etykiet, nie jest to możliwe (w najogólniejszym sensie). Są sposoby, aby wrócić w konkretnych przypadkach, jeśli wiesz, jakie były oryginalne kody i co je zastąpiłeś. Na przykład rozwiązania, które wypróbowałbyś, zadziałałyby, gdybyś nie zmienił etykiet. – joran

+0

tego właśnie mi brakowało. Myślałem, że R zapisuje nowe informacje ze starym. Chyba chciałem, żeby R zrobił coś bardziej podobnego do Stata z etykietami danych. –

Odpowiedz

0

Najprostszym rozwiązaniem jest zmiana sposobu określania wywołania czynnika, aby mógł on działać z dowolną liczbą poziomów liczbowych.

fact <- factor(c(1,1,0,1,0,1, 2), 
       levels=c(0,1, 2), 
       labels=c("no", "yes", "maybe")) 
as.numeric(fact) - 1 
+0

ważne jest, aby twoje kodowanie zawsze zaczynało się od 0, prawda? –

+0

Można zacząć od czegokolwiek, wystarczy zmienić stałą, której używasz do dostosowania. Zakłada to, że twoje liczby są sekwencyjne. Jeśli nie, to staje się trudne. – Raad

2
fact <- factor(c(1,1,0,1,0,1), 
       levels=c(1,0), 
       labels=c("yes", "no")) 
fact 
# [1] yes yes no yes no yes 
# Levels: yes no 
levels(fact) 
# [1] "yes" "no" 

Teraz poziomy fact jest wektorem znaków. as.numeric(as.character(fact)) w żaden sposób nie wykonuje tej pracy.

c(1, 0)[fact] 
# [1] 1 1 0 1 0 1 

Aktualizacja:

unclass(fact) 
# [1] 1 1 2 1 2 1 
# attr(,"levels") 
# [1] "yes" "no" 
mode(fact) 
# [1] "numeric" 
+0

na twojej aktualizacji, wynik 'unclass()' nie jest oryginalnym wektorem, prawda? –

+0

Tak. Używa 1 i 2. @EricGreen –

Powiązane problemy