2013-08-30 11 views
11

Wystąpił nieoczekiwany problem podczas próby przekształcenia wielu kolumn tabeli danych w kolumny czynnikowe. Mam powielana go w następujący sposób:Konwersja wielu kolumn tabeli danych na czynniki w R

library(data.table) 
tst <- data.table('a' = c('b','b','c','c')) 
class(tst[,a]) 
tst[,as.factor(a)] #Returns expected result 
tst[,as.factor('a'),with=FALSE] #Returns error 

tym ostatnim zwraca komenda „Błąd w Math.factor (j): abs bez znaczenia dla czynników”. Znalazłem to podczas próby uzyskania tst [, lapply (cols, as.factor), z = FALSE] gdzie cols był zbiorem wierszy, które próbowałem przekonwertować na czynniki. Czy istnieje jakieś rozwiązanie lub obejście tego problemu?

+3

+1 Dodałem: [Wdziecznie złap wewnętrzny błąd abs() na j, gdy = FALSE, ale j jest nieprawidłowo czynnikiem] (https://r-forge.r-project.org/tracker/index.php ? func = detail & aid = 4867 & group_id = 240 & atid = 978) –

Odpowiedz

23

Znalazłem jedno rozwiązanie:

library(data.table) 
tst <- data.table('a' = c('b','b','c','c')) 
class(tst[,a]) 
cols <- 'a' 
tst[,(cols):=lapply(.SD, as.factor),.SDcols=cols] 

Mimo to wcześniej wspomniane zachowanie wydaje buggy.

+0

Próbowałeś zindeksować tabelę danych za pomocą współczynnika - czynniki nie są ani znakami ani liczbami (są kategorycznymi wartościami bez jasnej jasności), więc data.table wypluwa błąd. – thelatemail

+1

Również 'tst [, as.factor (a)]' zwraca właśnie 'as.factor (tst $ a)' i nie indeksuje w ogóle tabeli data.table. Spróbuj 'tst [, 1: 5]', aby zobaczyć co mam na myśli. – thelatemail

+1

możesz wypróbować 'tst [, a: = as.factor (a)]' jeśli masz tylko jedną kolumnę lub zrobić to, co pokazałeś, lub też użyj 'set' w pętli for przez każdą z kolumn. – Arun

2

Zostało to naprawione w v1.8.11, ale prawdopodobnie nie w taki sposób, w jaki oczekiwałeś na. Od NEWS:

FR # 4867 jest już zaimplementowany. DT[, as.factor('x'), with=FALSE] gdzie x jest kolumną w DT, jest teraz odpowiednikiem DT[, "x", with=FALSE], zamiast zakończyć się błędem. Dzięki tresbot za zgłoszenie na SO: Converting multiple data.table columns to factors in R


Niektóre wyjaśnienia: Różnica, gdy stosuje with=FALSE, jest to, że kolumny data.table nie są już postrzegane jako zmiennych. To znaczy:

tst[, as.factor(a), with=FALSE] # would give "a" not found! 

spowoduje błąd "a" not found. Ale to, co robisz, a nie jest:

tst[, as.factor('a'), with=FALSE] 

jesteś w rzeczywistości tworząc czynnik "a" z level="a" i prosząc podzbioru że kolumny. To nie ma większego sensu. Take przypadku data.frame s:

DF <- data.frame(x=1:5, y=6:10) 
DF[, c("x", "y")] # gives back DF 

DF[, factor(c("x", "y"))] # gives back DF again, not factor columns 
DF[, factor(c("x", "x"))] # gives back two columns of "x", still integer, not factor! 

Więc w zasadzie, co starasz się o czynnik, podczas korzystania with=FALSE jest nie na elementach tej kolumnie, ale tylko, że nazwa kolumny ... Mam nadzieję, że udało mi się dobrze przekazać różnicę. Zapraszam do edycji/komentowania, jeśli są jakieś niejasności.

Powiązane problemy