#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()