2013-06-25 14 views
6

Próbuję napisać dataframe na badania do pliku tekstowego, jednak wraca do następującego błędu:Błąd podczas eksportowania dataframe do pliku tekstowego w R

Error in if (inherits(X[[j]], "data.frame") && ncol(xj) > 1L) 
      X[[j]] <- as.matrix(X[[j]]) : 
    missing value where TRUE/FALSE needed 

użyłem następującego polecenia na wywóz:

write.table(df, file ='dfname.txt', sep='\t') 

Nie mam pojęcia, na czym może polegać problem. Jeśli chodzi o "brakujące dane, gdzie PRAWDA/FAŁSZ jest potrzebna", mam tylko jedną kolumnę, która zawiera wartości PRAWDA/FAŁSZ i żadnej z tych wartości nie brakuje.

Zawartość dataframe:

> str(df) 
'data.frame': 776 obs. of 15 variables: 
$ Age   : Factor w/ 4 levels "","A","J","SA": 2 2 2 2 2 2 2 2 2 2 ... 
$ Sex   : Factor w/ 2 levels "F","M": 1 1 1 1 2 2 2 2 2 2 ... 
$ Rep   : Factor w/ 11 levels "L","NR","NRF",..: 1 1 4 4 2 2 2 2 2 2 ... 
$ FA   : num 61.5 62.5 60.5 61 59.5 59.5 59.1 59.2 59.8 59.9 ... 
$ Mass  : num 20 19 16.5 17.5 NA 14 NA 23 19 18.5 ... 
$ Vir1  : num 999 999 999 999 999 999 999 999 999 999 ... 
$ Vir2  : num 999 999 999 999 999 999 999 999 999 999 ... 
$ Vir3  : num 40 999 999 999 999 999 999 999 999 999 ... 
$ Location : Factor w/ 4 levels "Loc1",..: 4 4 4 4 4 4 2 2 2 2 ... 
$ Site  : Factor w/ 6 levels "A","B","C",..: 5 5 5 5 5 5 3 3 3 3 ... 
$ Date  : Date, format: "2010-08-30" "2010-08-30" ... 
$ Record  : int 35 34 39 49 69 38 145 112 125 140 ... 
$ SampleID : Factor w/ 776 levels "AT1-A-F1","AT1-A-F10",..: 525 524 527 528 
                   529 526 111 78 
                   88 110 ... 
$ Vir1Inc  : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ Month  :'data.frame': 776 obs. of 2 variables: 
    ..$ Dates: Date, format: "2010-08-30" "2010-08-30" ... 
    ..$ Month: Factor w/ 19 levels "Apr-2011","Aug-2010",..: 2 2 2 2 
                  2 2 18 18 18 18 ... 

Mam nadzieję, że dałem wystarczająco/właściwej informacji ...

Wielkie dzięki, Heather

+3

myślę pojawi się błąd, ponieważ Twój data.frame zawiera zagnieżdżonych nazw data.frame dzisiaj ... – agstudy

+0

@agstudy pliku pomocy mówi 'write.table' może obsługiwać zagnieżdżone ramki danych. Domyślam się, że coś jest sfałszowane, a kod '&& ncol (xj)' podany w komunikacie o błędzie próbuje przetworzyć macierz inną niż "macierz", stąd 'ncolxj)' zwraca 'NULL', a' R' nienawidzi "NULL" w operacja logiczna. –

+0

W każdym razie, oczywistym planem ataku jest wypróbowanie 'write.table' na części' df', po usunięciu "złych" elementów kandydujących i zobaczenie, który element jest winowajcą. –

Odpowiedz

4

Rozwiązanie firmy agstudy zapewnia świetną szybką naprawę, ale istnieje proste alternatywne/ogólne rozwiązanie , dla którego nie trzeba określać element (y) w data.frame że był (były) zagnieżdżone:

Poniższy bit jest po prostu kopiowane z agstudy's solution uzyskanie zagnieżdżony data.frame dd:

Month=data.frame(Dates= as.Date("2003-02-01") + 1:15, 
       Month=gl(12,2,15)) 
dd <- data.frame(Age=1:15) 
dd$Month <- Month 

Można użyć akhilsbehl'sLinearizeNestedList() funkcji (mrdwab udostępniane here) spłaszczenie (lub linearyzacji) zagnieżdżone poziomy:

library(devtools) 
source_gist(4205477) #loads the function 

ddf <- LinearizeNestedList(dd, LinearizeDataFrames = TRUE) 
# ddf is now a list with two elements (Age and Month) 

ddf <- LinearizeNestedList(ddf, LinearizeDataFrames = TRUE) 
# ddf is now a list with 3 elements (Age, `Month/Dates` and `Month/Month`) 

ddf <- as.data.frame.list(ddf) 
# transforms the flattened/linearized list into a data.frame 

ddf jest teraz data.frame bez ne Żądło. Jednak to nazwy kolumn nadal odzwierciedlają zagnieżdżony strukturę:

names(ddf) 
[1] "Age"   "Month.Dates" "Month.Month" 

Jeśli chcesz zmienić (w tym przypadku wydaje się zbędny mieć Month. napisany przed Dates, na przykład) można użyć gsub i some regular expression że skopiowany z Sacha Epskamp, ​​aby usunąć cały tekst z nazw kolumn przed ..

names(ddf) <- gsub(".*\\.","",names(ddf)) 
names(ddf) 
[1] "Age" "Dates" "Month" 

Jedyne co pozostało obecnie eksportuje się data.frame jak zwykle:

write.table(ddf, file="test.txt") 
5

Przykładem odtworzyć błędu. Tworzę zagnieżdżony data.frame:

Month=data.frame(Dates= as.Date("2003-02-01") + 1:15, 
       Month=gl(12,2,15)) 
dd <- data.frame(Age=1:15) 
dd$Month <- Month 
str(dd) 
'data.frame': 15 obs. of 2 variables: 
$ Age : int 1 2 3 4 5 6 7 8 9 10 ... 
$ Month:'data.frame': 15 obs. of 2 variables: 
    ..$ Dates: Date, format: "2003-02-02" "2003-02-03" "2003-02-04" ... 
    ..$ Month: Factor w/ 12 levels "1","2","3","4",..: 1 1 2 2 3 3 4 4 5 5 ... 

Nie staram się go uratować, ja odtworzyć błąd:

write.table(dd) 
Error in if (inherits(X[[j]], "data.frame") && ncol(xj) > 1L) 
    X[[j]] <- as.matrix(X[[j]]) : missing value where TRUE/FALSE needed 

Bez inverstigating jedna opcja do usuwania zagnieżdżona data.frame:

write.table(data.frame(subset(dd,select=-c(Month)),unclass(dd$Month))) 
2

Alternatywnie, można użyć funkcji „spłaszczyć” z pakietu jsonlite spłaszczyć dataframe przed wywozem. Osiąga taki sam rezultat innych wymienionych funkcji i jest znacznie łatwiejszy do wdrożenia.

jsonlite::flatten

https://rdrr.io/cran/jsonlite/man/flatten.html

+0

jsonlite :: flatten działa bardzo dobrze, aby spłaszczyć zagnieżdżoną ramkę danych. Ale podany link jest martwy. – Renhuai

Powiązane problemy