【发布时间】:2019-04-22 19:18:49
【问题描述】:
我正在尝试通过多次试验(来自单独的文本文件)绘制一张图。在下面的例子中,我用“发射率”变量绘制“位置”变量,当我单独使用 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 的新手,所以我不知道该怎么做。
提前感谢您的帮助!
【问题讨论】:
-
您正在使用
lapply循环来读取文件,这总是返回一个列表,而 ggplot 需要一个 data.frame。你能试试p <- read.table(i)吗?还是p <- read.table(i, header = T)? -
@teunbrand 您的建议确实产生了输出,但并非所有来自不同试验的数据同时绘制。它只是看起来不同,但 obs 数量相同。
-
@markus 我收到了这条消息:“x[, c("place", "firing_rate")] 中的错误:维度数不正确",但这可能是因为每个试验文件都有 3 个变量,但是我只是选择只看两个(地点和射击率)。
-
"
[.data.frame(read.table(x), , c("place", "firing_rate")) 中的错误:选择了未定义的列可以提供所以它确实有效? -
您想一次将来自不同试验的所有数据都绘制在一个图中吗?因为在这种情况下,所有列都相同,您可以通过
mylist <- lapply(setNames(files, files), read.table, header = T)读取所有文件。然后,您可以将一些 ID 放在带有mylist <- lapply(names(mylist), function(i) {cbind(mylist[[i]], ID = i)})的特殊列中,然后您可以通过执行mydata <- do.call(rbind, mylist)来组合mylist中的所有内容。但这只有在每个文件都具有相同的列结构时才有效。