假设我有数据集如下:

[data]

year value

2000 123

2000 345

2001 124

2001 456

2002 125

2002 567

[/data]

现在我想分别求每一年中value的最大值,生成一个新的列max,结果如下

[data]

year value max

2000 123 345

2000 345 345

2001 124 456

2001 456 456

2002 125 567

2002 567 567

[/data]

请问该如何实现?

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

k<-2 # k个数据作为一段

l<-length(data$value)

d<-l%/%k

smax<-vector(length=l)

for (i in 1:d){

smax[(i*k-k+1):(i*k)]<-max(data$value[(i*k-k+1):(i*k)])

}

if(l%%k>0) smax[(k*d+1):l]<-max(data$value[(k*d+1):l])

data$max<-smax

data

回复 第2楼 的 ccl123:感觉有更简单的方法,例如把year当因子,用apply函数算max,好久没用R了不知道如何实现?

MIfuns::reapply非常有用.

<br />
library(MIfuns)<br />
dat <- read.table("clipboard", header = TRUE)<br />
dat$MAX <- with(dat, reapply(value, year, max))<br />


[data]

year value MAX

1 2000 123 345

2 2000 345 345

3 2001 124 456

4 2001 456 456

5 2002 125 567

6 2002 567 567

[/data]
</p>

回复 第3楼 的 superdesolator:可以用tapply计算max,再用merge把计算出的最大值配进去。

<br />
Year <- rep(0:2, each=2) + 2000<br />
Value <- c(123, 345, 124, 456, 125, 567)<br />
Mdata <- data.frame(Year, Value)<br />
Maxdata <- cbind(unique(Year), tapply(Value, Year, max))<br />
Maxdata <- as.data.frame(Maxdata)<br />
colnames(Maxdata) <- c("Year", "Max")<br />
merge(Mdata, Maxdata, id="Year")<br />
</p>

new.data <- ddply(your.data,.(year),summarise,value = value, your.max = max(value))

两天没上来,有这么多回复,很感谢大家!

我遇到这个问题的,正好看到sweep这个函数,感觉似乎可以用sweep函数实现,但是不知道怎么做,所以就发上来请教下大家。这条回复也算是提供个线索吧,看看sweep可不可以。

回复 第4楼 的 YSU:我因为装不上xml包而装不上mifuns包。

回复 第6楼 的 SkyFx:谢谢指点,这个方法可以用。

tt=ddply(cnmacro,.(year),summarize,maxv=max(value))

tt2=merge(cnmacro,tt,id='year')

5 天 后

请教各位,我后来想了个办法

tt=tapply(cnmacro,cnmacro$year,function(x) sweep(x,2,max))

结果出错,说

Error in tapply(cnmacro, cnmacro$year, function(x) sweep(x, 2, max)) :

arguments must have same length

不知道apply函数联合sweep函数的方法可不可行,如果可行的话,该怎么修改?