10

我有一个包含几列的数据框,其中之一是一个称为“站点”的因素。如何将数据框拆分为具有唯一值“站点”的行块,然后使用函数处理每个块?数据如下所示:

site year peak
ALBEN 5 101529.6
ALBEN 10 117483.4
ALBEN 20 132960.9
ALBEN 50 153251.2
ALBEN 100 168647.8
ALBEN 200 184153.6
ALBEN 500 204866.5
ALDER 5 6561.3
ALDER 10 7897.1
ALDER 20 9208.1
ALDER 50 10949.3
ALDER 100 12287.6
ALDER 200 13650.2
ALDER 500 15493.6
AMERI 5 43656.5
AMERI 10 51475.3
AMERI 20 58854.4
AMERI 50 68233.3
AMERI 100 75135.9
AMERI 200 81908.3

我想为每个站点创建一个yearvs图。peak

4

7 回答 7

14

您可以使用isplit(来自“迭代器”包)创建一个迭代器对象,该对象循环遍历site列定义的块:

require(iterators)
site.data <- read.table("isplit-data.txt",header=T) 
sites <- isplit(site.data,site.data$site)

然后您可以使用foreach(来自“foreach”包)在每个块中创建一个图:

require(foreach)
foreach(site=sites) %dopar% {
 pdf(paste(site$key[[1]],".pdf",sep=""))
 plot(site$value$year,site$value$peak,main=site$key[[1]])
 dev.off()
}

作为奖励,如果您有一台多处理器机器并registerDoMC()首先调用(来自“doMC”包),循环将并行运行,从而加快速度。此革命博客文章中的更多详细信息:使用 isplit 对数据帧进行块处理

于 2009-09-08T17:29:18.547 回答
12

另一种选择是使用库中的ddply函数ggplot2。但是您提到您最想绘制峰值与年份的关系图,因此您也可以只使用qplot

A <- read.table("example.txt",header=TRUE)
library(ggplot2)
qplot(peak,year,data=A,colour=site,geom="line",group=site)
ggsave("peak-year-comparison.png")

替代文字

另一方面,我确实喜欢 David Smith 的解决方案,它允许在多个处理器上运行该函数。

于 2009-09-08T17:41:31.593 回答
10

我似乎记得普通的旧split()有一个 data.frames 的方法,所以它split(data,data$site)会产生一个块列表。sapply然后,您可以使用//对该列表进行操作lapplyfor

split()也很好unsplit(),因为它将创建一个与原始数据长度相同且顺序正确的向量。

于 2009-09-09T21:06:07.390 回答
6

这就是我要做的,尽管看起来你们已经通过库函数处理了它。

for(i in 1:length(unique(data$site))){
  constrainedData = data[data$site==data$site[i]];
  doSomething(constrainedData);
}

这种代码更直接,可能效率较低,但我更喜欢能够阅读它在做什么,而不是为同一件事学习一些新的库函数。也让这感觉更灵活,但老实说,这只是我作为新手的方式。

于 2009-09-08T19:11:42.317 回答
4

有两个方便的内置函数可以处理这种情况。?聚合和?by。在这种情况下,因为您想要一个绘图并且不返回标量,请使用 by()

data <- read.table("example.txt",header=TRUE)

by(data[, c('year', 'peak')], data$site, plot)

输出说NULL因为那是情节返回的内容。您可能希望将图形设备设置为 pdf 以捕获所有输出。

于 2009-09-08T19:05:00.427 回答
2

使用 lattice 包生成图也很容易:

library(lattice)
xyplot(year~peak | site, data)
于 2012-07-04T14:01:02.443 回答
0

如果您以以下方式打开数据,则可以使用该split功能:

data <- read.table('your_data.txt', header=T)
blocks <- split(data, data$site)

之后,块包含来自每个块的数据,您可以将其作为其他 data.frame 访问:

plot(blocks$ALBEN$year, blocks$ALBEN$peak)

每个情节依此类推。

于 2013-11-05T18:07:54.503 回答