2017-12-30 35 views
2

Ich versuche, eine Funktion über jede Zeile eines DataFrame anzuwenden, wie der Code zeigt.Wie speichere ich Julia für Schleifenrückläufe in einem Array oder Datenframe?

using RDatasets 
iris = dataset("datasets", "iris") 

function mean_n_var(x) 
    mean1=mean([x[1], x[2], x[3], x[4]]) 
    var1=var([x[1], x[2], x[3], x[4]]) 
    rst=[mean1, var1] 
    return rst 
end 

mean_n_var([2,4,5,6]) 

for row in eachrow(iris[1:4]) 
    println(mean_n_var(convert(Array, row))) 
end 

Anstatt Ergebnisse zu drucken, möchte ich sie jedoch in einem Array oder einem anderen DataFrame speichern.

Vielen Dank im Voraus.

+0

Könnten Sie [Verständnis] versuchen (https: //docs.julialang. org/de/stable/manual/arrays/# Comprehensions-1): '[mean_n_var (konvertieren (Array, Zeile)) für Zeile in jedemrow (Iris [1: 4])]'? – Liso

+0

Eine andere Alternative ist 'map':' map (row-> mean_n_var (convert (Array, row)), eachrow (iris [1: 4])) ' –

+0

Um eine Matrix als Ausgabe zu erhalten, eine Kombination aus' reshape' und ein Verständnis: 'reshape ([v für Zeile in jedemrow (Iris [1: 4]) für v in mean_n_var (konvertieren (Array, Zeile))], 2, :)' –

Antwort

2

Ich dachte, es ist es wert zu erwähnen, einige Optionen zur Verfügung über das, was bereits erwähnt wurde.

Ich nehme an, Sie möchten ein Matrix oder ein DataFrame. Es gibt mehrere mögliche Ansätze.

Erstens ist die direkteste ein Matrix zu bekommen:

mean_n_var(a) = [mean(a), var(a)] 
hcat((mean_n_var(Array(x)) for x in eachrow(iris[1:4]))...) # rows 
vcat((mean_n_var(Array(x)).' for x in eachrow(iris[1:4]))...) # cols 

ein weiterer möglicher Ansatz ist vektorisiert, zB:

mat_iris = Matrix(iris[1:4]) 
mat = hcat(mean(mat_iris, 2), var(mat_iris, 2)) 
df = DataFrame([vec(f(mat_iris, 2)) for f in [mean,var]], [:mean, :var]) 
DataFrame(mat) # this constructor also accepts variable names on master but is not released yet 
Verwandte Themen