2012-10-12 41 views
5

Pregunta simple, creo, pero no he encontrado una respuesta. Cómo deshacerse del atributo de clase "AsIs" en mi marco de datos. Está impidiendo que el write.dbf del paquete foreign se convierta a dbf. Estoy trabajando desde rpy2 pero funciona con el marco de datos R sin "AsIs". Puse el código completo debajo del mensaje de error. dbfs = write_dbf (r_dataframe)Deshacerse del atributo de clase "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 

estoy usando rpy2 pitón hablar con R. Eso no es donde está el problema, pero aquí está mi código. El write.dbf funciona desde Rpy2 si utilizo un marco de datos de R sin "AsIs".

(pitón)

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

¿Ha intentado simplemente eliminar ese atributo de clase de las columnas afectadas? – joran

Respuesta

9

Así es como me gustaría deshacerme de un atributo AsIs clase. Tenga en cuenta que me preocupo por conservar cualquier otro atributo de clase que pueda tener el vector:

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

Hola se ve bien, me aseguraré de poder hacerlo este fin de semana. – user1246428

+0

y muchas gracias – user1246428

Cuestiones relacionadas