2013-06-25 14 views
6

Ben bir metin dosyasına Ar bir dataframe yazmaya çalışıyorum metin dosyasına dataframe ihraç:Hata ne zaman ancak şu hata dönüyor, R

Ben ihracat için aşağıdaki komutu kullanılır
Error in if (inherits(X[[j]], "data.frame") && ncol(xj) > 1L) 
      X[[j]] <- as.matrix(X[[j]]) : 
    missing value where TRUE/FALSE needed 

:

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

sorun kaynaklanıyor olabilir hiçbir fikrim yok. "DOĞRU/YANLIŞ gerekli olduğunda veri eksik" olarak, DOĞRU/YANLIŞ değerler içeren sadece bir sütun var ve bu değerlerin hiçbiri eksik. dataframe ait

İçindekiler:

> 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 ... 

ben ... Yeterince/doğru bilgi verdik

çok teşekkür ederiz umut Heather

+3

Your data.frame yardım dosyası @agstudy yuvalanmış data.frame isimleri Ay ... – agstudy

+0

içerdiğinden hata alıyorsan düşünüyorum write.table' iç içe işleyebilir 'diyor dataframes. Benim tahminim, bir şeyin hata yaptığı ve hata mesajında ​​verilen '&& ncol (xj)' kodunun matris işlememeye çalıştığı, dolayısıyla 'ncolxj '' 'NULL' 'i döndürdüğü ve' R' 'nin" NULL "ifadesinden nefret ettiği mantıksal bir işlem. –

+0

Her halükarda, atak planındaki saldırı, adayı "kötü" unsurları kaldırdıktan sonra "df" nin bir kısmına 'write.table' denemek ve hangi unsurun suçlu olduğunu görmek. –

cevap

4

Agstudy tarafından çözüm harika bir hızlı düzeltme sağlar, ancak belirtmeniz gerekmeyen bir basit alternatif/genel çözüm vardır. İç içe geçti data.frame içinde eleman (lar) (idi):

aşağıdaki bit sadece iç içe data.frame dd elde etmek agstudy's solution kopyalanır

:

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 

Sen akhilsbehl'sLinearizeNestedList() kullanabilirsiniz

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 Kuzeydoğuya olmayan bir data.frame şöyledir: (here hazır mrdwab) işlevi, iç içe geçmiş seviyeleri dümdüz (ya da lineer bir) için acı. Ancak, sütun adları hala iç içe yapısını yansıtacak var: Bunu değiştirmek istiyorsanız

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

ben kopyalanan gsub ve some regular expression kullanabilirsiniz (durumda, örneğin Month.Dates önce yazılmış olması gereksiz görünüyor) Sacha Epskamp'dan, .'dan önceki sütun adlarındaki tüm metinleri kaldırın.

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

şimdi kalan tek şey

zamanki gibi data.frame ihraç:

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

bir örnek hatayı yeniden.

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 

inverstigating olmadan, tek seçenek kaldırmak için iç içe data.frame:

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

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 ... 

bunu kaydetmeyi deneyin Hayır, hata yeniden: Ben iç içe geçmiş bir data.frame oluşturmak

2

Alternatif olarak, ihracat öncesi dataframe düzleştirmek jsonlite paketinden "düzleştirmek" işlevini kullanabilirsiniz. Bahsedilen diğer işlevlerin aynı sonucunu elde eder ve uygulanması daha kolaydır.

jsonlite::flatten

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

+0

jsonlite :: flatten yuvalanmış bir veri çerçevesini düzleştirmek için gerçekten iyi çalışıyor. Ama sağladığınız bağlantı öldü. – Renhuai

İlgili konular