#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()