J'aimerais pouvoir transformer une colonne individuelle dans un ensemble de données d'inchange et enregistrer les données résultantes définies sur un nouveau fichier (CSV). Quel est le moyen le plus simple de faire ça? P>
essentiellement, j'aimerais pouvoir cartographier une fonction sur une colonne dans l'ensemble de données et remplacer la colonne d'origine par ce résultat. P>
4 Réponses :
Vous pouvez définir quelque chose comme: et utiliser comme p> Il n'y a qu'un seul problème avec le changement de noms de colonne - i J'essaierai de le réparer, quand j'aurai du temps libre ... p> p>
Encore une fois: Peut-être que vous pouvez utiliser la structure interne de l'ensemble de données.
user=> (defn update-column
[dataset column f & args]
(->> (map #(apply update-in % [column] f args) (:rows dataset))
vec
(assoc dataset :rows)))
#'user/update-column
user=> d
[:col-0 :col-1]
[1 2]
[3 4]
[5 6]
user=> (update-column d :col-1 str "d")
[:col-0 :col-1]
[1 "2d"]
[3 "4d"]
[5 "6d"]
Oui, peut-être que ce sera plus optimal, même s'il est peut-être préférable d'ajouter des opérations correspondantes sur des jeux de données
Cette solution a la beauté qu'il peut être adaptée aux cas où chaque ligne est de structure de données associative, de carte ou de séquence.
Voici deux fonctions similaires, nom de colonne et préservation de la commande.
(use '(incanter core io))) (def data (col-names (read-dataset 'data.csv') [:a :b]) (save (transform-rows :a #(* % 2) data) 'transformed-data.csv')
pour ceux qui peuvent utiliser des versions récentes d'inchant ... p> ADD-Colonne Strong> & de la DOCS: p> " ajoute une colonne, avec des valeurs données, à un jeu de données. " P> tow-colonne h3>
(use '(incanter core datasets))
(def cars (get-dataset :cars))
(add-derived-column :dist-over-speed [:dist :speed] (fn [d s] (/ d s)) cars)
(with-data (get-dataset :cars)
(view (add-derived-column :speed**-1 [:speed] #(/ 1.0 %))))