2016-04-15 7 views
2

Ich versuche, eine Spalte eines Pandas-Datenrahmens in Faktor zu konvertieren, weil die Funktion, die ich in R aufrufen möchte, Faktoren erwartet.Konvertieren Pandas Dataframe Spalte zu R-Faktoren

pandas2ri.activate()  
#second column of labels has to be converted to factors 
labels = read_csv(path_to_csv) 
as_factor = ro.r['as.factor'] 
output = package.function(another_df, as_factor(labels['column_name'])) 

Im Folgenden ist der Fehler, den ich bekommen:

rpy2.rinterface.RRuntimeError: Error in sort.list(y) : 'x' must be atomic for 'sort.list' 
Have you called 'sort' on a list? 

Was soll ich tun?

Reproduzierbare Beispiel unten:

import pandas as pd 

df = pd.DataFrame({'Col': [10, 20], 
        'x': ['Control', 'Low_Cav02']}) 

from rpy2 import robjects as ro 

from rpy2.robjects import pandas2ri 
pandas2ri.activate() 

as_factor = ro.r['as.factor'] 

labels = as_factor(df['Col']) 
print labels 

labels = as_factor(df['x']) 
print labels 

Ausgang:

[1] 10 20 
Levels: 10 20 

/Users/swetabh/Envs/damet/lib/python2.7/site-packages/rpy2/robjects/functions.py:106: UserWarning: Error in sort.list(y) : 'x' must be atomic for 'sort.list' 
Have you called 'sort' on a list? 

    res = super(Function, self).__call__(*new_args, **new_kwargs) 
Traceback (most recent call last): 
    File "damet/analysis.py", line 26, in <module> 
    labels = as_factor(df['x']) 
    File "/Users/swetabh/Envs/damet/lib/python2.7/site-packages/rpy2/robjects/functions.py", line 178, in __call__ 
    return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs) 
    File "/Users/swetabh/Envs/damet/lib/python2.7/site-packages/rpy2/robjects/functions.py", line 106, in __call__ 
    res = super(Function, self).__call__(*new_args, **new_kwargs) 
rpy2.rinterface.RRuntimeError: Error in sort.list(y) : 'x' must be atomic for 'sort.list' 
Have you called 'sort' on a list? 
+0

könnten Sie versuchen, ein reproduzierbares Beispiel zu zeigen, dass wir auch laufen können Ihnen helfen? –

+1

Ich weiß nicht, ob es dein Problem lösen würde, aber der Faktor von R's Faktor ist Kategorie in Pandas: 'df [" einige_Spalte "]. Astype (" Kategorie ")' – ayhan

+0

@MathieuB Fertig. LMK, wenn das hilft. – Swetabh

Antwort

1

Das funktioniert an meinem Ende gut. Welche Version von rpy2 verwendest du?

Edit: ORGINAL unten beantworten - ich die Frage

mißverstanden Wenn versucht, eine R DataFrame, die Standardkonverter in rpy2 wiederum Python-Listen in R-Listen zu erstellen. Wenn Sie einen R-Vektor verwenden möchten, verwenden Sie die Konstruktoren für Vektoren.

Mit Ihrem Beispiel das aussehen könnte:

df = ro.DataFrame({'Col': ro.vectors.IntVector([10, 20]), 
        'x': ro.vectors.StrVector(['Control', 'Low_Cav02'])}) 
+0

Ich bekomme den folgenden Fehler, wenn ich dies tue: ValueError: Wenn Sie alle Skalarwerte verwenden, müssen Sie einen Index übergeben – Swetabh

+0

Ja. Ich schaffte es irgendwie, die Frage falsch zu lesen und nicht-funktionierenden Code in die Antwort zu schreiben. Ich bearbeite die Antwort jetzt. – lgautier