2012-10-12 7 views
5

Proste pytanie Myślę, że nie znalazłem odpowiedzi. Jak pozbyć się atrybutu klasy "AsIs" w mojej ramce danych. Zapobiega przekształceniu pakietu write.dbf z foreign w dbf. Pracuję z rpy2, ale działa z ramką danych R bez "AsIs". Umieszczam pełny kod pod komunikatem o błędzie. dBFS = write_dbf (r_dataframe)Pozbywanie się atrybutu klasy "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 

Używam Pythona rpy2 rozmawiać R. To nie jest, gdzie jest problem, ale tutaj jest mój kod. write.dbf działa z Rpy2, jeśli używam ramki danych z R bez "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

Czy próbowałeś po prostu usunąć ten atrybut klasy z wykonanych kolumn? – joran

Odpowiedz

9

Oto w jaki sposób pozbyć się atrybutem AsIs klasy. Zauważ, że dbam o zachowanie wszelkich innych atrybutów klasy, które może posiadać wektor:

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

Cześć dobrze wygląda, sprawię, że będę mógł zarządzać nią w ten weekend. – user1246428

+0

i wielkie dzięki – user1246428

Powiązane problemy