Создать цикл for для объединения нескольких пар CSV-файлов. - PullRequest
1 голос
/ 16 июня 2019

Для начала я биолог, который отслеживает движения и поведение морских птиц.К этим морским птицам я прилагаю два отдельных биолога, которые собирают данные одновременно.Одним из них является GPS, который записывает координаты каждые 2 минуты, другой называется регистратором глубины во времени (TDR), который записывает глубину каждую 1 секунду (когда птица ныряет за определенную глубину, событие погружения можно считать погружением в поисках пищи).Объединение этих данных поможет определить пространственно, где птицы ныряют ради еды.Таким образом, каждая отслеживаемая птица имеет пару данных GPS и TDR, которые необходимо объединить на основе их отметки времени.Однако, что могло бы облегчить жизнь, было бы обработать их с помощью цикла For или чего-то еще, поскольку я отслеживал более 20 птиц, и объединять их по одной довольно утомительно.У меня очень мало опыта написания циклов и мне нужна помощь.У кого-нибудь есть какие-либо предложения или советы?

В настоящее время я занимаюсь объединением этих двух наборов данных по одному для каждой птицы, сопоставляя временную метку на данных GPS (дата) с временной меткой на TDR.data (DateTime), который отфильтровывает данные глубины, которые не имеют соответствующих координат.

# Read in GPS and TDR files for each bird
rh01gps <- read.csv(file.choose(), sep=",", stringsAsFactors = F, strip.white = T, na.strings = c(""))

head(rh01gps)
          x        y              date      id
1 -123.0033 37.69831 6/3/2018 01:02:00 2018_01
2 -123.0033 37.69826 6/3/2018 01:04:00 2018_01
3 -123.0032 37.69821 6/3/2018 01:06:00 2018_01
4 -123.0033 37.69829 6/3/2018 01:08:00 2018_01
5 -123.0033 37.69830 6/3/2018 01:10:00 2018_01
6 -123.0033 37.69832 6/3/2018 01:12:00 2018_01

rh01tdr <- read.csv(file.choose(), sep=",", stringsAsFactors = F, strip.white = T, na.strings = c(""))

head(rh01tdr)
      Date Pressure   Temp        Time          DateTime
1 6/3/2018    -0.94 25.203 12:00:00 AM 6/3/2018 00:00:00
2 6/3/2018    -0.94 25.203 12:00:01 AM 6/3/2018 00:00:01
3 6/3/2018    -0.94 25.203 12:00:02 AM 6/3/2018 00:00:02
4 6/3/2018    -0.94 25.203 12:00:03 AM 6/3/2018 00:00:03
5 6/3/2018    -0.94 25.203 12:00:04 AM 6/3/2018 00:00:04
6 6/3/2018    -0.94 25.203 12:00:05 AM 6/3/2018 00:00:05

# Create a dataframe with dates from TDR file that match GPS datetime (many 
# more data points from TDRs than GPS, need to filter out dates that won't 
# have a match in the GPS file)
rh_gps_tdr <- subset(rh01tdr, DateTime %in% rh01gps$date)

# Merge newly created data
merge <- cbind(rh_gps_tdr, rh01gps$x, rh01gps$y)

# Rename longitude (rh01gps$x) and latitude (rh01gps$y) columns to "x" and "y"
colnames(merge)[colnames(merge)=="rh01gps$x"] <- "x"
colnames(merge)[colnames(merge)=="rh01gps$y"] <- "y"

# Subset data to filter out unnecessary columns
rh01_gt <- subset(merge, select = c(5, 6, 7, 2, 3))

# Combined GPS coordinates plus pressure data.
head(rh01_gt)
           DateTime         x        y Pressure   Temp
1 6/3/2018 01:02:00 -123.0033 37.69831    -0.94 24.828
2 6/3/2018 01:04:00 -123.0033 37.69826    -0.91 24.703
3 6/3/2018 01:06:00 -123.0032 37.69821    -0.94 24.625
4 6/3/2018 01:08:00 -123.0033 37.69829    -0.94 24.578
5 6/3/2018 01:10:00 -123.0033 37.69830    -0.91 24.531
6 6/3/2018 01:12:00 -123.0033 37.69832    -0.94 24.516

write.csv(rh01_gt, "RHAU01_2018_TDR&GPS.csv")

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

1 Ответ

1 голос
/ 17 июня 2019

Я поместил ваш код в цикл for.Этот цикл должен работать до тех пор, пока в каждом из них имеется одинаковое количество CSV-файлов и они имеют одинаковый шаблон имени.В моем тесте имена файлов были rh01gps.csv, rh02gps.csv… и rh01tdr.csv, rh02tdr.csv… Я должен был установить формат даты, потому что в противном случае он не работал (обратите внимание, что я предположил, что ваш формат датыдд / мм / YYYYY).Я также изменил subset, потому что если есть столбец даты, я думаю, что нет необходимости использовать столбец DateTime (смело меняйте его).

# your directory with all the csv files
setwd('yourpath')

# list tdr files by pattern 'tdr'
tdr.list<-list.files(pattern='tdr')

# list gps files by pattern 'gps'
gps.list<-list.files(pattern='gps')

# starting loop
for (i in 1:length(gps.list)) 
{
  # open each csv
  tdr<-read.csv(tdr.list[i], sep=",", stringsAsFactors = F, strip.white = T, na.strings = c(""))
  gps<-read.csv(gps.list[i], sep=",", stringsAsFactors = F, strip.white = T, na.strings = c(""))

  # set date format 
  gps$date<-as.Date(gps$date, '%d/%m/%Y')
  tdr$Date<-as.Date(tdr$Date, '%d/%m/%Y')

  # Create a dataframe with dates from TDR file that match GPS datetime (many 
  # more data points from TDRs than GPS, need to filter out dates that won't 
  # have a match in the GPS file)
  rh_gps_tdr <- subset(tdr, Date %in% gps$date) # subset made with date

  # Merge newly created data
  merge <- cbind(rh_gps_tdr, gps$x, gps$y)

  # Rename longitude (rh01gps$x) and latitude (rh01gps$y) columns to "x" and "y"
  colnames(merge)[colnames(merge)=="gps$x"] <- "x"
  colnames(merge)[colnames(merge)=="gps$y"] <- "y"

  # Subset data to filter out unnecessary columns
  gt <- subset(merge, select = c(5, 6, 7, 2, 3))

  # get the file number to have it in the output file
  filenumber<-substr(gps.list[i], 3,4) # 3 & 4 are the position of the number in the name (rhXXgps.csv)

  # writing csv file
  write.csv(gt, paste0("RHAU", filenumber, "_2018_TDR&GPS.csv"))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...