Форматирование нескольких файлов одновременно в R - PullRequest
0 голосов
/ 12 февраля 2019

Я довольно новичок в R, поэтому я надеюсь, что этот вопрос все еще будет интересен.Я создал цикл for, который произвел 11 CSV-файлов.Вот код, который я использовал для этого в случае, если это может помочь прояснить вопрос:

for (i in seq(0, 1, by = 0.1))
{collar$results2<-mutate(collar,results2 = case_when( (probability > i & results1 == "POSITIVE") | (probability < i & results1 == "NEGATIVE") ~ TRUE, TRUE ~ FALSE) )
as.character(collar$results2)
collaraccuracy1=paste('collar41361_41365', i, 'csv', sep = '.')
write.csv(collar,collaraccuracy1)}

Как видите, все созданные файлы имеют следующий формат: collar41361_41365.i.csv, с `` i` в диапазоне от 01 к 0,1, например, так:

[1] "collar41361_41365.0.csv"
[1] "collar41361_41365.0.1.csv"
[1] "collar41361_41365.0.2.csv"
[1] "collar41361_41365.0.3.csv"
[1] "collar41361_41365.0.4.csv"
[1] "collar41361_41365.0.5.csv"
[1] "collar41361_41365.0.6.csv"
[1] "collar41361_41365.0.7.csv"
[1] "collar41361_41365.0.8.csv"
[1] "collar41361_41365.0.9.csv"
[1] "collar41361_41365.1.csv"

Теперь я хотел бы отформатировать все файлы по одному, поскольку они имеют одинаковую структуру (10 столбцов, 240 строк и одинаковый заголовок столбца) и одно и то же имя.формат.

См. Ниже код с действиями, которые я пытался выполнить над этими 11 файлами.Я использовал Sys.glob, поскольку упоминалось, что это лучший способ выполнить задачу в другом посте.Ранее я закодировал эти действия для одного файла, и это сработало.Теперь я хочу применить код ко всем 11 файлам одновременно:

#1) Reading multiple files at one. Now, this will only work for the files with a decimal value of i in their name -which is fine-. If I was reading files with i=0 or i=1, then we'll have the pattern "collar41361_41365.*.csv". Am I right?

collaraccuracy<-lapply(Sys.glob("collar41361_41365.***.csv"), read.csv)

#2) Select only the columns with header "observed","predicted","probability","results1","results2.results2"

collaraccuracy<-fread("collar41361_41365.***.csv",select=c("observed","predicted","probability","results1","results2.results2"),stringsAsFactors = F)

#3) Rename column "results2.results2" to "results2"

colnames(collaraccuracy)<-c("observed","predicted","probability","results1","results2")

#4) Create 6th column "results" by merging columns "results1" and "results2"

collaraccuracy$results <- paste(collaraccuracy$results2, 
collaraccuracy$results1,sep="_")


#5) End of the formatting. Write new formated csv files with the pattern "collar41361_by_41365.i.csv"

collaraccuracy2=paste('collar41361_by_41365', i, 'csv', sep = '.')
write.csv(collaraccuracy,collaraccuracy2)

Как вы можете видеть, у меня есть 5 различных действий для вычисления, в конечном итоге должно быть 9 файлов для значений i (0,1, 0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9)

Меня особенно интересует синтаксис в действиях 1) и 2), но это лучшее, что я могу сделать до сих пор.

Какие-нибудь советы, чтобы сформулировать это?Любая помощь приветствуется!

PS Обновление: я пытался создать функцию и применить ее к остальным файлам с помощью lapply:

collarcolumns<-function(collaraccuracy1)
{collaraccuracy1<-fread(("collar41361_41365.1.csv"),select=c("observed","predicted","probability","results1","results2.results2"),stringsAsFactors = F)
colnames(collaraccuracy1)<-c("observed","predicted","probability","results1","results2")
collaraccuracy1$results <- paste(collaraccuracy1$results2, collaraccuracy1$results1,sep="_")
collaraccuracy2=paste('collar41361_by_41365', i, 'csv', sep = '.')
write.csv(collaraccuracy1,collaraccuracy2)}

lapply(Sys.glob("collar41361_41365.*.csv"), collarcolumns)

И получил 11 "NULL" s напечатано R .. Я был на правильном пути?

1 Ответ

0 голосов
/ 13 февраля 2019

Делая шаг назад, кажется, что вы хотите сделать следующее для каждого i:

  • Добавить столбец results2, который проверяет, соответствует ли прогнозируемое значение наблюдаемому значению с вероятностьюi.
  • Добавьте столбец results, который объединяет results1 и results2.

Причина, по которой вы видите странные имена столбцов, такие как results2.results2, заключается в том, чтоисходный цикл for является избыточным;вам не нужны оба оператора присваивания (collar$results2 <- ...) и mutate.Мы можем свести все это к одному циклу, например:

for(i in seq(0, 1, by = 0.1)) {
  collar.temp = collar %>%
    mutate(results2 = case_when((probability > i & results1 == "POSITIVE") |
                                  (probability < i & results1 == "NEGATIVE") ~ T,
                                T ~ F)) %>%
    mutate(results = paste(results1, results2, sep = "_"))
  collaraccuracy1 = paste('collar41361_41365', i, 'csv', sep = '.')
  write.csv(collar.temp, collaraccuracy1)
}

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

collar.tidy = do.call(
  "bind_rows",
  lapply(
    seq(0, 1, by = 0.1),
    function(x) {
      collar %>%
        mutate(cutoff = x,
               results2 = case_when((probability > x & results1 == "POSITIVE") |
                                      (probability < x & results1 == "NEGATIVE") ~ T,
                                    T ~ F)) %>%
        mutate(results = paste(results1, results2, sep = "_"))
    }
  )
)

См. здесь для отличного введения в аккуратные данные.Вы можете подумать о других способах наведения порядка в этом наборе данных;например, мне неясно, является ли строго обязательным столбец results, объединяющий два других столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...