R:在数据框的子集中查找列的最大值
R: Find max value for column among a subset of a data frame
我有一个数据框 df
,其中包含列 ID
、Year
、Value1
、Value2
、Value3
和 21788928 行。我需要通过 Year
和 ID
对数据进行子集化,并在该子集中找到最大值 Value1
保存该行的其余信息,我需要对 Year
和 ID
(年份从 1982 年到 2013 年,
ID 从 1 到 28371)
我试图在双 for 循环中做到这一点:
year<-seq(1982, 2013)
cnt=1
for (i in 1:32) {
for (j in 1:28371)
A<-df[df$Year==year[i]&df$ID==j,]
maxVal[cnt,]<-A[A$Value1==max(A$Value1),]
cnt=cnt+1
}
}
但这需要很长时间。有没有更有效的方法来做到这一点?也许使用 ddply
或 with
.
您可以使用dplyr
library(dplyr)
dat %>% group_by(ID, Year) %>%
summarise(mval=max(Value1)) -> result
或 plyr
,保留所有其他列(并将最大值 1 重复为 mval
)
ddply(dat, .(ID, Year), function(x) {
transform(x[which.max(x$Value1),], mval=Value1)
}, .drop=F)
数据
dat <- data.frame(ID=sample(1:10, 100, rep=T),
Year=sample(1995:2000, 100, rep=T),
Value1=runif(100))
基础 R 解决方案 aggregate
:
prov <- aggregate(. ~ Year + ID, data = dat, FUN = max)
我有一个数据框 df
,其中包含列 ID
、Year
、Value1
、Value2
、Value3
和 21788928 行。我需要通过 Year
和 ID
对数据进行子集化,并在该子集中找到最大值 Value1
保存该行的其余信息,我需要对 Year
和 ID
(年份从 1982 年到 2013 年,
ID 从 1 到 28371)
我试图在双 for 循环中做到这一点:
year<-seq(1982, 2013)
cnt=1
for (i in 1:32) {
for (j in 1:28371)
A<-df[df$Year==year[i]&df$ID==j,]
maxVal[cnt,]<-A[A$Value1==max(A$Value1),]
cnt=cnt+1
}
}
但这需要很长时间。有没有更有效的方法来做到这一点?也许使用 ddply
或 with
.
您可以使用dplyr
library(dplyr)
dat %>% group_by(ID, Year) %>%
summarise(mval=max(Value1)) -> result
或 plyr
,保留所有其他列(并将最大值 1 重复为 mval
)
ddply(dat, .(ID, Year), function(x) {
transform(x[which.max(x$Value1),], mval=Value1)
}, .drop=F)
数据
dat <- data.frame(ID=sample(1:10, 100, rep=T),
Year=sample(1995:2000, 100, rep=T),
Value1=runif(100))
基础 R 解决方案 aggregate
:
prov <- aggregate(. ~ Year + ID, data = dat, FUN = max)