Я хочу извлечь данные из нескольких файлов CSV и записать их в один файл CSV - PullRequest
0 голосов
/ 04 июля 2019

У меня есть 365 CSV-файлов в папке, каждый из которых содержит три столбца.Первый из них - «lat», второй - «lon», а третий - «sm».Я хочу извлечь данные "sm" для двух конкретных значений lat и lon и записать все результаты в один CSV-файл.

Ответы [ 2 ]

1 голос
/ 04 июля 2019
# first I create an example with 3 data sets and write them to disk. 
setwd("H:\\SO")
dir()
library(tidyverse)
unique(mtcars$gear)

a <- mtcars %>% 
  split(.$gear)

my_names <- c("tre", "fire", "fem")

names(a) <- my_names

for(i in 1:length(my_names)){
write_csv(a[[i]] , paste0(my_names[[i]], ".csv"))
}

rm(list = ls())

# Now I want to read in all the files. 
my_names <- c("tre", "fire", "fem")
files <- dir()

# I read in all the files
b <- map(files, read_csv) 

# I only select the column that I want
for(i in 1:length(files)){
 b[[i]] <- b[[i]]["gear"]   
} 

final_df <- do.call(dplyr::bind_rows, b)
final_df

# A tibble: 32 x 1
    gear
   <dbl>
 1     5
 2     5
 3     5
 4     5
 5     5
 6     4
 7     4
 8     4
 9     4
10     4
# ... with 22 more rows

Я не разделил столбцы на основе других столбцов, но это легко сделать ...

0 голосов
/ 05 июля 2019

Вот подход, использующий базу R. Сначала нам нужно создать некоторые данные, которые похожи на ваше описание:

# Create dummy data - three files with 5 observations in each
set.seed(2)
dta <- data.frame(lat=sample(4, 15, replace=TRUE),
   lon=sample(4, 15, replace=TRUE), sm=sample(100, 15))
write.csv(dta[1:5, ], file="file01.csv", row.names=FALSE)
write.csv(dta[6:10, ], file="file02.csv", row.names=FALSE)
write.csv(dta[11:15, ], file="file03.csv", row.names=FALSE)

Теперь мы читаем файлы в список, преобразуем список во фрейм данных иизвлеките значения sm, соответствующие критерию:

# Read files and extract values
fls <- paste0("file0", 1:3, ".csv")
fls.lst <- lapply(fls, read.csv)
names(fls.lst) <- fls
all <- do.call(rbind, fls.lst)
vals <- all[all$lat==1 & all$lon==3, ]
write.csv(vals, file="sm_values.csv")
read.csv("sm_values.csv")
#              X lat lon sm
# 1 file01.csv.1   1   3 43
# 2 file02.csv.2   1   3  6
# 3 file02.csv.3   1   3 83

Вы должны прочитать страницы руководства для каждой из этих функций, чтобы увидеть, что они делают.

...