2012-10-12 10 views
5

Domanda semplice Penso ma non ho trovato una risposta. Come eliminare l'attributo di classe "AsIs" sul mio frame di dati. Impedisce allo write.dbf dal pacchetto foreign di convertirsi in dbf. Sto lavorando da rpy2 ma funziona con frame di dati R senza "AsIs". Ho messo il codice completo sotto il messaggio di errore. dBFS = write_dbf (r_dataframe)Eliminazione dell'attributo di classe "AsIs"

Error in function (dataframe, file, factor2char = TRUE, max_nchar = 254) : 
    data frame contains columns of unsupported class(es) AsIs 

--------------------------------------------------------------------------- 
RRuntimeError        Traceback (most recent call last) 
<ipython-input-26-9072df63231a> in <module>() 
----> 1 dbfs = write_dbf(r_dataframe) 

/home/matthew/.virtualenvs/mypython/lib/python3.2/site-packages/rpy2-2.2.6dev_20120814-py3.2-linux-i686.egg/rpy2/robjects/functions.py in __call__(self, *args, **kwargs) 
    80     v = kwargs.pop(k) 
    81     kwargs[r_k] = v 
---> 82   return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs) 

/home/matthew/.virtualenvs/mypython/lib/python3.2/site-packages/rpy2-2.2.6dev_20120814-py3.2-linux-i686.egg/rpy2/robjects/functions.py in __call__(self, *args, **kwargs) 
    32   for k, v in kwargs.items(): 
    33    new_kwargs[k] = conversion.py2ri(v) 
---> 34   res = super(Function, self).__call__(*new_args, **new_kwargs) 
    35   res = conversion.ri2py(res) 
    36   return res 

RRuntimeError: Error in function (dataframe, file, factor2char = TRUE, max_nchar = 254) : 
    data frame contains columns of unsupported class(es) AsIs 

Sto usando python rpy2 di parlare con R. Questo non è dove il problema è, ma qui è il mio codice. Il write.dbf funziona da Rpy2 se utilizzo un frame dati da R senza "AsIs".

(python)

df = DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C':[7,8,9]},index=["one", "two", "three"]) I am going from python pandas dataframe to and R datafram using 

    fore = importr("foreign") 

    In [19]: 

    r_dataframe = com.convert_to_r_dataframe(df) 

    In [20]: 

    print(type(r_dataframe)) 

    <class 'rpy2.robjects.vectors.DataFrame'> 

    In [32]: 

    r_dataframe 

    Out[32]: 

<DataFrame - Python:0xb3db8ac/R:0xc23ac50> 
[IntVector, IntVector, IntVector] 
    A: <class 'rpy2.robjects.vectors.IntVector'> 
    <IntVector - Python:0xc1fb1ec/R:0xc23ac28> 
[  1,  2,  3] 
    B: <class 'rpy2.robjects.vectors.IntVector'> 
    <IntVector - Python:0xc1fb36c/R:0xc23ac00> 
[  4,  5,  6] 
    C: <class 'rpy2.robjects.vectors.IntVector'> 
    <IntVector - Python:0xc1fb4ec/R:0xc23abd8> 
[  7,  8,  9] 


    print(r_dataframe) 

      A B C 
    one 1 4 7 
    two 2 5 8 
    three 3 6 9 

    In [25]: 

    write_dbf =robjects.r("write.dbf") 

    read_dbf = robjects.r("read.dbf") 

    In [26]: 

    dbfs = write_dbf(r_dataframe) 

Error in function (dataframe, file, factor2char = TRUE, max_nchar = 254) : 
    data frame contains columns of unsupported class(es) AsI 

    dbfs = write_dbf(r_dataframe) 
+1

Hai provato semplicemente a rimuovere quell'attributo di classe dalle colonne effettive? – joran

risposta

9

Ecco come vorrei liberarmi di un attributo AsIs di classe. Nota che mi prendo cura di preservare qualsiasi altro attributo di classe che il vettore possa avere:

unAsIs <- function(X) { 
    if("AsIs" %in% class(X)) { 
     class(X) <- class(X)[-match("AsIs", class(X))] 
    } 
    X 
} 

## Show why the function is needed 
a <- 1:10 
b <- factor(1:10) 

class(I(a)) 
# [1] "AsIs" 
class(I(b)) 
# [1] "AsIs" "factor" 

## Show that the function reverses the effect of `I()` 
identical(a, unAsIs(I(a))) 
# [1] TRUE 
identical(b, unAsIs(I(b))) 
# [1] TRUE 
+0

Hi sembra buono, mi assicurerò di poterlo gestire questo fine settimana. – user1246428

+0

e grazie mille – user1246428