2012-05-25 10 views
11

Kod fragmentu:W jaki sposób ifelse R działa z danymi znakowymi?

blarg = data.frame(a=c("aa", "bb", "dd")) 
blarg$b = blarg$a 
# blarg$b is now c("aa", "bb", "dd") 
blarg$b = ifelse(blarg$a!="bb",blarg$a,"ZZZ") 
# blarg$b is now c(1, "ZZZ", 3) 
# I expected c("aa", "ZZZ", "dd") 
# typeof(blarg$b) is "character" 

Dlaczego blarg $ B C (1 "ZZZ" 3) Skąd pochodzą liczby?

+0

R wprowadził współczynnik "blarg $ a". Możesz spróbować 'stringsAsFactors = FALSE' –

+0

Nie mam nic przeciwko temu, żeby być czynnikiem. Jak uzyskać ten sam czynnik, aby wyjść z ifelse? – dfrankow

+1

Możesz rzucić 'blarg $ a' na znak:' ifelse (blarg $ a! = "Bb", as.character (blarg $ a), "ZZZ") 'daje' c ("aa", "ZZZ", "dd") ' –

Odpowiedz

11

+1 za użycie data.frame o nazwie blarg.

Aby rozwinąć to, co Ben powiedział, czynniki są przechowywane wewnętrznie jako liczby całkowite, więc kiedy robisz coś takiego, R nie radzi sobie z tym w sposób, jakiego oczekujesz.

Spójrz na str(blarg) w krokach swojego kodu powyżej.

Można użyć stringsAsFactors=FALSE jak Ben zasugerował, lub skorzystać z czynnika:

ifelse(blarg$a!='bb', levels(blarg$a), 'ZZZ') 

Albo jeszcze lepiej, jeśli chcesz zastąpić poziomy blarg$a które są 'bb', można wyeliminować oświadczenie ifelse w sumie:

levels(blarg$a)[levels(blarg$a)=='bb'] <- 'ZZZ' 
Powiązane problemy