【发布时间】:2016-05-19 13:50:39
【问题描述】:
我正在尝试运行一个循环并填充一个矩阵。这是一个示例数据:
#generate sample data
reg<-rep(c("a","b","c","d"),each=3)
year<-rep(c(2005:2008),each=3)
sea<-rep(c("Winter","Summer","Autumn"),4)
set.seed(1)
area<-runif(12)
prod<-runif(12)
yld<-runif(12)
dat<-data.frame(reg,year,sea,area,prod,yld)
dat$reg<-as.character(dat$reg)
dat$sea<-as.character(dat$sea)
str(dat)
#create an empty matrix to store my results
results.mat <- matrix(0, ncol = 6, nrow = NROW(unique(dat$reg)))
#create a loop
for (j in unique(sort(dat$reg))){
reg<-dat[dat$reg==j,]
for (k in unique(sort(reg$year))){
year<-reg[reg$year==k,]
results.mat<-year[year$area==max(year$area),]
}}
results.mat
我想做的是对于每个reg 和每个year,我想提取area 最大的那一行。这意味着对于a,应该选择带有Autumn 的行,因为area 在area 的所有三个值中是最大值。同样,对于b,应该选择Winter 的行,因为area 是最大值。同样,对于d,应该选择Summer 的行,因为area 是最大值。
因此,最终矩阵(或数据框)应该有一行用于a、b、c、d。但是,当我运行上面的循环时,它只给了我d 的行,而不是其他三个。我认为这与循环的最后一行有关,我指定它填充矩阵results.mat 并覆盖先前的选择。但我不确定矩阵,我应该如何逐行填充。
谢谢
【问题讨论】:
-
矩阵和data.frames是不同的。如果要选择 data.frame 的行,结果将/应该也是 data.frame(如下面的答案)。
-
基础 R 中的一个选项:
dat[as.logical(ave(dat$area,dat$reg,dat$year,FUN=function(x) x==max(x),drop=TRUE)),]