автоматизация слияния фреймов данных с добавлением строки для хранения информации о происхождении - PullRequest
0 голосов
/ 13 февраля 2020

Я новичок ie с R. У меня есть 6 разных фреймов данных (U, V, W, X, Y, Z), поступающих из разных файлов CSV, каждый из них имеет одинаковые столбцы (Фамилия, Имя , Winter, Spring, Summer), и я хотел бы создать новый фрейм данных, содержащий 5 строк и шестую строку, которая указывает одну из букв (U, V, ...), откуда берутся исходные данные. Я попытался с помощью следующего кода:

U <- read.csv(file = "U", header = T)
V <- read.csv(file = "V", header = T)
W <- read.csv(file = "W", header = T)
X <- read.csv(file = "X", header = T)
Y <- read.csv(file = "Y", header = T)
Z <- read.csv(file = "Z", header = T)

U['class'] <- rep("U")
V['class'] <- rep("V")
W['class'] <- rep("W")
X['class'] <- rep("X")
Y['class'] <- rep("Y")
Z['class'] <- rep("Z")

students <- rbind(U, V, W, X, Y, Z)

Мне действительно нужно использовать al oop, чтобы я мог в будущем go от A до Z. Я хотел бы сделать что-то вроде этого Это полная чушь.

for(class.name in list(U, V, W, X, Y, Z)){
  class.name['class'] <- rep('class')
}

Есть ли разумный способ сделать это?

Спасибо

Отредактировано

Чтобы прояснить мой вопрос, идея в том, что у меня есть 6 разных станций, собирающих необработанные данные и дающих мне 6 разных кадров данных. Я хочу объединить их, сохраняя информацию о том, с какой станции поступают необработанные данные.

Возможное неполное решение Следуя совету @ MrFlick, мне удалось собрать все в один список как следует

classes <- c('U', 'V', 'W', 'X', 'W', 'Z')
my.files <- paste(classes,".csv",sep="")
year.eight <- lapply(my.files, read.csv, header = T)
name(year.eight) <- classes

Однако конечный результат должен состоять из одного отдельного фрейма данных с дополнительным столбцом, в котором указывается, в каком классе обучаются учащиеся. Может ли кто-нибудь помочь мне с этим, пожалуйста?

Ответы [ 3 ]

2 голосов
/ 13 февраля 2020

Позвольте мне поделиться примером

Предположим, у нас есть 3 файла A.csv, B.csv и C.csv в папке с именем "data" в нашем рабочем каталоге. Предположим, что они содержат один столбец с числовым значением c. Тогда этот код делает то, что вы хотите.

library(readr)

files <- paste0("data/", list.files("data"))
df_list <- list()

for (i in seq_along(files)) {
  tmp <- read_csv(files[[i]])
  tmp["class"] <- sub("\\..*", "", basename(files[[i]])) # ".csv$" also works in this case
  df_list[[i]] <- tmp
}

output <- dplyr::bind_rows(df_list)
output
##  A tibble: 3 x 2
#       x class
#   <dbl> <chr>
# 1     1 A    
# 2     1 B    
# 3     1 C

Отредактировано после превосходного предложения Тенсибая.

1 голос
/ 14 февраля 2020

Если вы сохраните все интересующие вас файлы в указанном каталоге c, вы сможете получить к ним доступ, используя list.files (). Затем l oop над этим, используя map_df из пакета purrr. Думаю, это делает трюк

#Load package
library(purrr) 

#Define the directory where files are saved
path <- "your_file_path/" #e.g. my Mac desktop "~/Desktop/"

#Create vector of file names
files <- list.files(path)

#Use map_df function from purrr to loop over and return a data frame with extra label variable
map_df(files, function(x){
  #save as df
  df <- read.csv(paste0(path, "/",x))
  #use gsub to remove ".csv" from file name
  df['class'] <- gsub("\\.csv", "", x)
  df
})
1 голос
/ 13 февраля 2020

Чтобы сделать это проще со списком data.frames, он может выглядеть примерно так:

classes <- c('U', 'V', 'W', 'X', 'W', 'Z')
my.files <- paste(classes,".csv",sep="")
year.eight <- mapply(function(path, code) {
    data <- read.csv(path, header = T)
    data$class <- code
    data
}, my.files, classes)
combined <- do.call("rbind", year.eight)

Или используя dplyr

classes <- c('U', 'V', 'W', 'X', 'W', 'Z')
my.files <- paste(classes,".csv",sep="")
year.eight <- lapply(my.files, read.csv, header = T)
names(year.eight) <- classes
combined <- dplyr::bind_rows(year.eight, .id="class")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...