2013-03-11 4 views
9

Mam zestaw danych w R, który wygląda, i został przekształcony w taki sam sposób, jak w poniższym przykładzie. Celem jest przekształcenie wartości nA do czegoś innego (np „false” lub „0”), które mogą być następnie wykorzystane do stworzenia nowej kolumnyZamień NA w R - działa w zestawie danych treningowych, ale komunikat ostrzegawczy po zastosowaniu do rzeczywistych danych

ortho.test<-data.frame(rep("a",10));colnames(ortho.test)=("ODB6") 
ortho.test$FBGN=c("FBgn0132258","FBgn0131535","FBgn0138769","FBgn01561235","FBgn0316645","FBgn874916","FBgn5758641","FBgn5279946","FBgn67543154","FBgn2451645") 
ortho.test$Species=c("DROME","DROSI","DROSE","DROAN","DROYA","DROPS","DROPE","DROVI","DROGR","DROWI") 

ortho<-reshape(ortho.test,direction="wide",idvar="ODB6",timevar="Species") 
ortho$FBGN.DROME<-NA 
is.na(ortho) 

która zwraca wektor mi powiedzieć wszystko ale FBGN.DROME są FAŁSZ z następującymi str() wyjście:

> str(ortho) 
'data.frame': 1 obs. of 11 variables: 
$ ODB6  : Factor w/ 1 level "a": 1 
$ FBGN.DROME: logi NA 
$ FBGN.DROSI: chr "FBgn0131535" 
$ FBGN.DROSE: chr "FBgn0138769" 
$ FBGN.DROAN: chr "FBgn01561235" 
$ FBGN.DROYA: chr "FBgn0316645" 
$ FBGN.DROPS: chr "FBgn874916" 
$ FBGN.DROPE: chr "FBgn5758641" 
$ FBGN.DROVI: chr "FBgn5279946" 
$ FBGN.DROGR: chr "FBgn67543154" 
$ FBGN.DROWI: chr "FBgn2451645" 
- attr(*, "reshapeWide")=List of 5 
    ..$ v.names: NULL 
    ..$ timevar: chr "Species" 
    ..$ idvar : chr "ODB6" 
    ..$ times : chr "DROME" "DROSI" "DROSE" "DROAN" ... 
    ..$ varying: chr [1, 1:10] "FBGN.DROME" "FBGN.DROSI" "FBGN.DROSE" "FBGN.DROAN" ... 

mogę zmienić na to 0

ortho[is.na(ortho)]<-0 
is.na(ortho) 

która zwraca wektor mówi mi wszystkie są teraz FAŁSZ - sukces, bo teraz mogę tworzyć ac olumn przy użyciu ifelse(), aby wskazać, który z wierszy nie ma wartości 0 lub FALSE (lub jakiejkolwiek etykiety tekstowej używanej do zastąpienia NA) w dowolnej kolumnie ...

Jednak, gdy zastosuję to do rozwiniętej ramki danych nA nie ma konwersji i uzyskać następujące ostrzeżenia

> ortho[is.na(ortho)]<-0 
There were 12 warnings (use warnings() to see them) 
> warnings() 
Warning messages: 
1: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(62938L, ... : 
    invalid factor level, NAs generated 
2: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(67667L, ... : 
    invalid factor level, NAs generated 
3: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(122384L, ... : 
    invalid factor level, NAs generated 
4: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(136498L, ... : 
    invalid factor level, NAs generated 
5: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(84764L, ... : 
    invalid factor level, NAs generated 
6: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(162734L, ... : 
    invalid factor level, NAs generated 
7: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(33586L, ... : 
    invalid factor level, NAs generated 
8: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(38959L, ... : 
    invalid factor level, NAs generated 
9: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(149363L, ... : 
    invalid factor level, NAs generated 
10: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(846L, ... : 
    invalid factor level, NAs generated 
11: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(98228L, ... : 
    invalid factor level, NAs generated 
12: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(110267L, ... : 
    invalid factor level, NAs generated 

i to jest) wyjście Str (

> str(ortho) 
    'data.frame': 17217 obs. of 13 variables: 
    $ ODB6  : Factor w/ 17217 levels "EOG60023J","EOG60023K",..: 1 2 3 4 5 6 7 8 9 10 ... 
    $ FBGN.DROGR: Factor w/ 164289 levels "FBgn0000008",..: 62938 54687 54705 56261 52591 58895 52161 52477 59180 53404 ... 
    $ FBGN.DROMO: Factor w/ 164289 levels "FBgn0000008",..: 67667 65117 65951 66506 68291 71722 73134 68667 72523 76080 ... 
    $ FBGN.DROVI: Factor w/ 164289 levels "FBgn0000008",..: 122384 121133 120018 121674 NA 125620 123754 123969 127130 130755 ... 
    $ FBGN.DROWI: Factor w/ 164289 levels "FBgn0000008",..: 136498 136809 139642 137108 NA 141689 136363 137237 135869 132801 ... 
    $ FBGN.DROPE: Factor w/ 164289 levels "FBgn0000008",..: 84764 78121 81229 80829 85509 82276 79001 80267 77133 87679 ... 
    $ FBGN.DROPS: Factor w/ 164289 levels "FBgn0000008",..: 162734 158625 162203 158653 158028 22427 158179 13830 19898 160874 ... 
    $ FBGN.DROAN: Factor w/ 164289 levels "FBgn0000008",..: 33586 35261 35694 23649 33601 25796 33808 33861 25917 29992 ... 
    $ FBGN.DROER: Factor w/ 164289 levels "FBgn0000008",..: 38959 41203 40738 39865 38807 46087 38821 44982 47952 38091 ... 
    $ FBGN.DROYA: Factor w/ 164289 levels "FBgn0000008",..: 149363 153417 153106 152243 149654 147146 149664 149482 147635 144838 ... 
    $ FBGN.DROME: Factor w/ 164289 levels "FBgn0000008",..: 846 7219 6958 162946 525 1892 125 3510 163839 10111 ... 
    $ FBGN.DROSE: Factor w/ 164289 levels "FBgn0000008",..: 98228 94438 94153 102953 98068 95380 98082 92553 93497 95950 ... 
    $ FBGN.DROSI: Factor w/ 164289 levels "FBgn0000008",..: 110267 108223 107983 107246 110164 117494 116973 110504 106459 NA ... 
    - attr(*, "reshapeWide")=List of 5 
     ..$ v.names: NULL 
     ..$ timevar: chr "Species" 
     ..$ idvar : chr "ODB6" 
     ..$ times : Factor w/ 12 levels "DROAN","DROER",..: 3 5 10 11 6 7 1 2 12 4 ... 
     ..$ varying: chr [1, 1:12] "FBGN.DROGR" "FBGN.DROMO" "FBGN.DROVI" "FBGN.DROWI" ... 
    > 

pomożesz mi dostać główną dataframe grać razem jak teście jeden zrobił ? (PS - Wiem, że dostanę "to duplikat, czytam strony pomocy i szukam poprawnie" odpowiedzi - ale przeszukaliśmy, w ten sposób dowiedziałem się, jak wymienić NA, i nie znalazłem żadnego z tym samym problemem.)

+1

Czy nie zauważyłeś różnicy między wyjściami 'str' w twoich dwóch przykładach? – joran

+0

@joran Dzięki, widzę to teraz - więc być może przyczyną problemu są czynniki, ale to rodzi dwa pytania: 1. Dlaczego dane testowe pochodzą z postaci, ale rzeczywiste dane wydają się być czynnikami? i (co ważniejsze) 2. w jaki sposób @ & ?! czy to jest naprawione? – Ell

+1

Zobacz argumenty 'as.is',' colClasses' i 'stringsAsFactors' w dokumentacji dla' read.table'. – joran

Odpowiedz

23

Masz problem z czynnikami. Jeśli spojrzeć na prawdziwego zestawu danych, zauważysz

Factor w/ 164289 levels ..... 

Na przykład

R> x = factor(c("A", "B")) 
R> x[x=="A"] = 0 
Warning message: 
In `[<-.factor`(`*tmp*`, x == "A", value = 0) : 
    invalid factor level, NAs generated 

Trzeba dodać 0 jak najwyższym poziomie. Więc coś takiego:

x = factor(x, levels=c(levels(x), 0)) 
x[is.na(x)] = 0 

powinien załatwić sprawę. Jednak lepszą taktyką będzie zmiana sposobu czytania danych. Na przykład:

read.table(filename, stringsAsFactors=FALSE) 
3

Dla tych, których dane nie pochodzą z odczytu pliku. Konwersja Każda kolumna data.frame mogą być wykonane z tej pętli (zastosowanie nie działa, ponieważ przetwarza data.frame do matrycy):

for (k in 1:ncol(data)){ 
    data[[k]] <- as.character(data[[k]]) 
} 

a następnie zastosować rozwiązanie tego question gdy roztwór poziom nie robi nie działa.

+0

Czy rozważyłeś 'lapply' zamiast' apply'? – Uwe

Powiązane problemy