Наложение испытаний в отдельных файлах на один график ggplot

#r #for-loop #ggplot2

#r #для цикла #ggplot2

Вопрос:

Я пытаюсь построить один график с несколькими испытаниями (из отдельных текстовых файлов). В приведенном ниже случае я отображаю переменную «место» с переменной «скорость стрельбы», и это работает, когда я использую ggplot самостоятельно:

 a <- read.table("trial1.txt", header = T)
library(ggplot2)
ggplot(a, aes(x = place, y = firing_rate))   geom_point()   geom_path()
  

Но когда я пытаюсь создать цикл for для просмотра каждого пробного файла в папке и отображения его на том же графике, у меня возникают проблемы. Это то, что у меня есть до сих пор:

  files <- list.files(pattern=".txt")
 for (i in files){
   p <- lapply(i, read.table)
   print(ggplot(p, aes(x = place, y = firing_rate))   geom_point()   geom_path())
 }
  

Это выдает мне сообщение «Ошибка: data должен быть фрейм данных или другой объект, принудительный с помощью fortify() , а не список». Я новичок в R, поэтому не уверен, что с этим делать.

Заранее благодарю вас за помощь!

Комментарии:

1. Вы используете lapply цикл для чтения файлов, и это всегда возвращает список, в то время как ggplot нуждается в data.frame. Не могли бы вы попробовать p <- read.table(i) ? Или p <- read.table(i, header = T) ?

2. @teunbrand ваше предложение действительно дало результат, но это не все данные из разных испытаний, построенные сразу. Это просто выглядит по-другому, но с тем же количеством obs.

3. @markus Я получил это сообщение: «Ошибка в x [, c («place», «firing_rate»)]: неверное количество измерений», но это может быть связано с тем, что в каждом пробном файле есть 3 переменные, но я просто выбираю только две (место и скорость стрельбы).).

4. «Ошибка в [.data.frame (read.table (x), , c («place», «firing_rate»)): выбраны неопределенные столбцы» Извините за затруднения, могу ли я предоставить какую-либо дополнительную информацию, чтобы она работала?

5. Вы хотите, чтобы все данные из разных испытаний отображались на одном графике одновременно? Поскольку в этом случае все столбцы одинаковы, вы можете прочитать все файлы в mylist <- lapply(setNames(files, files), read.table, header = T) . Затем вы можете поместить некоторый идентификатор в специальный столбец с mylist <- lapply(names(mylist), function(i) {cbind(mylist[[i]], ID = i)}) , а затем вы можете объединить все в mylist , выполнив mydata <- do.call(rbind, mylist) . Но это работает только в том случае, если каждый файл имеет одинаковую структуру столбцов.

Ответ №1:

В общем, избегать циклов — лучшее решение в R. Поскольку вы используете ggplot , вам может быть интересно использовать map_df функцию из tidyverse:

Сначала создайте функцию чтения и включите имя файла в качестве пробной метки:

 readDataFile = function(x){
a <- read.table(x, header = T)
a$trial = x
return(a)
}
  

Далее map_df :

 dataComplete = map_df(files, readDataFile)
  

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

Наконец, вы можете строить график почти так же, как и раньше, но можете различать на основе переменной trial:

 ggplot(dataComplete, aes(x = place, y = firing_rate, color=trial, group=trial))   geom_point()   geom_path()