假设我有数据集如下:
[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')
请教各位,我后来想了个办法
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函数的方法可不可行,如果可行的话,该怎么修改?