Как мне избавиться от нескольких столбцов с одинаковыми именами в R?

#r #join #merge #duplicates #multiple-columns

#r #Присоединиться #слияние #дубликаты #несколько столбцов

Вопрос:

Я собираю оценки SAT по школьным округам в Техасе и их объемам расходов на образование. Данные для оценок SAT поступают в CSV-файлах, которые разделены по годам. Я хочу объединить оценки в свой фрейм данных, в котором указана сумма расходов на образование, без создания нескольких столбцов для общего балла, оценки по математике, оценки по чтению и т. Д.

Я пробовал разные типы функций объединения, semi_join , full_join , left_join , и т. Д., Но ни один из них, похоже, не решает проблему, с которой я сталкиваюсь.

 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"))
  

На выходе я получаю столбцы Math.x, Math.y, Total.x, Total.y и так далее для каждого объединенного фрейма данных. Кроме того, sat17 включает столбец с именем ERW вместо чтения, потому что тест изменился в этом году. Я хочу сохранить ERW отдельно, а остальные результаты чтения, математики и итоговые баллы выстраиваться под одним из каждого столбца.

Ответ №1:

Я думаю, что то, что вы хотите сделать, это связать их вместе… то есть «добавить» их один поверх другого.

Попробуйте:

 do.call(rbind, dfs) # dfs is the list of dataframes
  

или с помощью purrr

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

Комментарии:

1. Функция do.call вроде бы решает проблему, но приводит к сложенному выводу, который отличается от того, что мне нужно. Функция bind_rows, похоже, не решает проблему, по крайней мере, так, как я предполагаю, что она используется.

Ответ №2:

Объяснение

dplyr автоматически переименует все столбцы, к которым вы не присоединяетесь, и будет иметь соответствующее имя столбца в объединенном наборе данных.

В вашем случае, поскольку вы хотите только присоединиться by=c("District", "year") , все другие столбцы с таким же именем будут переименованы.

Столбцы начального набора данных .x добавляются в конец их имени, в то время как столбцы, оставленные соединенными .y , добавляются в конец их имени.

Решение

Если вы хотите, чтобы математика, чтение и итоговые данные были в одном столбце, вам нужно сложить наборы данных друг над другом с помощью dplyr::bind_rows()

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

Ответ №3:

Или, скажем, вы хотите просто связать их на уровне .csv для начала, просто поместите все свои файлы в подкаталог с именем «data». Вы можете попробовать что-то вроде этого:

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

Комментарии:

1. Итак, я попробовал это: setwd(«C:/Users/wasd777/Desktop/project /») библиотека(purrr) binded_data <- tibble(имена файлов = list.files(«sat_2017.csv»,»sat_2016.csv», «sat_2015.csv», «sat_2014.csv», «sat_2013.csv», «sat_2012.csv»,»sat_2011.csv»))%>% mutate(yearly_sat = map(filenames, read_csv)) %>% unnest() Но я получил ошибку: ошибка в list.files(«sat_2017.csv», «sat_2016.csv», «sat_2015.csv»,»sat_2014.csv», : недопустимый аргумент ‘all.files’ Что я делаю не так?

2. Функция list.files() возвращает вектор, который просто содержит имена всех файлов в текущем каталоге. В этом случае либо поместите все нужные файлы в новую папку и измените каталог, либо просто запустите library(purrr) library(tidverse) binded_data <- tibble(имена файлов = c(«sat_2017.csv», «sat_2016.csv», «sat_2015.csv», «sat_2014.csv»,»sat_2013.csv»,»sat_2012.csv»,»sat_2011.csv»))%>% мутировать(yearly_sat = map(filenames, read_csv)) %>% unnest()