0

我是新手R,我相信这很简单,但我不确定要搜索哪些术语。

我在目录中有一系列数据文件,每个都具有相同的格式(制表符分隔,每个都有X_DATAY_DATA列)。我想打开它们并用 绘制它们ggplot2,每个数据集都有不同的颜色。我尝试了以下方法,但它返回错误(也在下面)。

脚本:

require(ggplot2)

# ---
# open files
d_files <- list.files(pattern = '*.dat', recursive=TRUE)
d_list <- lapply(d_files, read.csv, sep = "\t")

## ---
# add a name attribute
for (i in seq_along(d_list)) attr(d_list[[i]], 'Name') <- d_files[[i]]

# ---
# join all of the files into a single dataset
d <- do.call('rbind', d_list)

# ---
# plot
p <- ggplot(data=d, aes(x=X_DATA, y=Y_DATA, colour=Name)) + geom_point()
ggsave(p, file="test.pdf", width=8, height=4.5)

输出:

Loading required package: ggplot2
Loading required package: methods
Error in eval(expr, envir, enclos) : object 'Name' not found
Calls: ggsave ... sapply -> lapply -> eval.quoted -> lapply -> FUN -> eval
Execution halted

编辑:

这是一个python生成一些数据的脚本

from random import uniform
N = 100  # entries per file
M = 3  # number of files
for i in range(M):
    with open('%i.dat' % (i + 1), 'w') as f:
        f.write('X_DATA\tY_DATA\n')
        f.write('\n'.join((('%g\t%g' % (x, x ** (i + 1))) for x in (uniform(0,1) for j in range(N)))))

R脚本显示了我想要的内容,但是,在这里,我必须明确输入每个文件。这不适用于工作版本。

# ---
# read each file and assign the dataset a name
d1 <- read.csv('1.dat', sep='\t')
d1$Name = '1.dat'
d2 <- read.csv('2.dat', sep='\t')
d2$Name = '2.dat'
d3 <- read.csv('3.dat', sep='\t')
d3$Name = '3.dat'

# ---
# combine datasets
d <- rbind(d1, d2, d3)

# ---
# plot
p <- ggplot(data=d, aes(x=X_DATA, y=Y_DATA, colour=Name)) + geom_point()
ggsave(p, file="test.pdf", width=8, height=4.5)

例子

从原始脚本中,按以下方式设置以下内容:for (i in seq_along(d_list)) d_list[[i]][['Name']] <- d_files[[i]]-- 但这并不意味着我现在有一个Name每个数据点调用的文本元素吗?这让我觉得不理想...

4

1 回答 1

1

这是完全的猜测,因为你没有给我们一个可重复的例子。

让我们阅读错误消息的第一位。总是一个好主意:

Error in eval(expr, envir, enclos) : object 'Name' not found

现在,Name在您的脚本中出现两次:

for (i in seq_along(d_list)) attr(d_list[[i]], 'Name') <- d_files[[i]]

p <- ggplot(data=d, aes(x=X_DATA, y=Y_DATA, colour=Name)) + geom_point()

我怀疑你想要做的是Name在数据框中添加一列(评论你的代码!!!)。这不是 R 所说的“属性”。在 R 中,属性是可以粘贴在对象上的少量额外元数据,也用于维度、行名和列名(但不是实际数据本身)。

我认为在您的循环中,请执行以下操作:

 for (i in seq_along(d_list)) d_list[[i]][['Name']] <- d_files[[i]]

添加名称列。

一种不涉及添加Name到每个数据帧的方法是:

ggplot()+geom_point(aes(x=X_DATA,y=Y_DATA,col=d_files[[1]]),d_list[[1]]) +
        geom_point(aes(x=X_DATA,y=Y_DATA,col=d_files[[2]]),d_list[[2]]) +
        geom_point(aes(x=X_DATA,y=Y_DATA,col=d_files[[3]]),d_list[[3]])

但是尽我所能,我不能在一个循环中得到这个。拉阿格。

这几乎有效:

plots = laply(1:3,function(i)
    {geom_point(aes(x=X_DATA,y=Y_DATA,col=d_files[[i]]),d_list[[i]])}
)
Reduce("+",plots,init=ggplot())

但失败,因为 ggplot在创建 geom 时进行评估,但d_list[[i]]在绘制 geom 时进行评估。所以你会看到所有三组的点,但它们似乎都来自。如果您设置并重新运行该函数,您会看到它们似乎都来自第二个数据集。id_files[[i]]i=3i=2Reduce

可能有一种方法不涉及制作字符串并对其进行评估。会请大师...

于 2013-05-02T08:41:43.117 回答