1
votes

Comment puis-je me débarrasser de plusieurs colonnes portant le même nom dans R?

Je recueille les scores SAT des districts scolaires du Texas et le montant de leurs dépenses d'éducation. Les données pour les scores SAT sont fournies dans des fichiers csv répartis par année. Je souhaite consolider les scores dans mon dataframe qui a le montant des dépenses d'éducation sans créer plusieurs colonnes pour Total, Score Math, Score de lecture, etc.

J'ai essayé les différents types de fonctions de jointure, semi_join , full_join , left_join , etc. mais aucun de ceux-ci ne semble résoudre le problème que je rencontre.

temp1<-left_join(temp, sat17, by= c("District","year"))%>% 

left_join(., sat16, by=c("District","year"))%>%

left_join(., sat15, by=c("District","year"))%>%

left_join(., sat14, by=c("District","year"))%>%

left_join(., sat13, by=c("District","year"))%>%

left_join(., sat12, by=c("District","year"))%>%

left_join(., sat11, by=c("District","year"))

La sortie me donne les colonnes Math.x, Math.y, Total.x, Total.y, et ainsi de suite pour chaque dataframe joint. En outre, sat17 inclut une colonne appelée ERW, au lieu de Reading car le test a changé cette année-là. Je veux garder ERW séparé, et le reste des scores de lecture, de mathématiques et de total à aligner sous l'une de chaque colonne.


0 commentaires

3 Réponses :


2
votes

Je pense que ce que vous voulez faire est de les lier ensemble ... c'est-à-dire de les "ajouter" les uns sur les autres.

Essayez:

library(purrr)
bind_rows(dfs, .id = NULL)


1 commentaires

La fonction do.call résout en quelque sorte le problème, mais aboutit à une sortie empilée différente de ce dont j'ai besoin. La fonction bind_rows ne semble pas résoudre le problème, du moins la manière dont je suppose qu'elle est utilisée.



0
votes

Ou dites que vous voulez simplement les lier au niveau .csv pour commencer, jetez simplement tous vos fichiers dans un sous-répertoire appelé "data". Vous pouvez essayer quelque chose comme ceci:

setwd("./data/")
library(purrr)
library(tidyverse)
binded_data <- tibble(filenames = list.files()) %>%
  mutate(yearly_sat = map(filenames, read_csv)) %>%
  unnest()


2 commentaires

J'ai donc essayé ceci: bibliothèque setwd ("C: / Users / wasd777 / Desktop / project /") (purrr) binded_data <- tibble (filenames = list.files ("sat_2017.csv", "sat_2016.csv", "sat_2015 .csv "," sat‌ _2014.csv "," sat_2013‌ .csv "," sat_2012.csv "‌," sat_2011.csv "))%>% mutate (year_sat = map (noms de fichiers, read_csv))%> % unnest () Mais j'ai eu une erreur: Erreur dans list.files ("sat_2017.csv", "sat_2016.csv", "sat_2015.csv", "sat_2014.csv",: argument 'all.files' invalide Que suis-je Je fais mal?


La fonction list.files () renvoie un vecteur qui contient juste les noms de tous les fichiers du répertoire courant. Dans ce cas, jetez tous les fichiers désirés dans un nouveau dossier et modifiez le répertoire ou exécutez simplement library (purrr) library (tidverse) binded_data <- tibble (filenames = c ("sat_2017.csv", "sat_2016.csv") , "sat_2015.csv", "sat_2014.csv‌", "sat_2013.csv", "sa‌ t_2012.csv", "sat_201‌ 1.csv"))%>% mutate (year_sat = map (noms de fichiers, read_csv) )%>% unnest ()



0
votes

Explication

dplyr va automatiquement renommer toutes les colonnes que vous ne joignez pas par et ont un nom de colonne correspondant dans l'ensemble de données joint.

Dans votre cas, puisque vous ne voulez rejoindre que by = c ("District", "year") , toutes les autres colonnes portant le même nom seront renommées.

Les colonnes de l'ensemble de données de départ obtenant .x ajoutés à la fin de leur nom, tandis que les colonnes laissées jointes reçoivent .y ajoutés à la fin de leur nom.

Solution

Si vous voulez avoir Math, Reading et Total dans la même colonne, vous devez alors empiler les ensembles de données les uns sur les autres avec dplyr :: bind_rows ()

combined_sat <- dplyr::bind_rows(sat17, sat16, sat15, sat14, sat13, sat12,  sat11)

0 commentaires