我在一个文件夹中有365个csv文件,每个文件包含三列。第一个是“ lat”,第二个是“ lon”,第三个是“ sm”。我想提取两个特定的经度和纬度值的“ sm”数据,并将所有结果写入单个csv文件中。
答案 0 :(得分:1)
# 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
我还没有基于其他列将其作为子集,但是很容易做到...
答案 1 :(得分:0)
这是使用基数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
您应该阅读每种功能的手册页,以了解它们的作用。