2016-05-19 15 views
0

ループを実行して行列を埋めようとしています。ここではサンプルデータがある:私が何をしようとしています何ループ内の行ごとに行列を埋めてください

#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を意味し、areaの3つの値のうち最大値がareaであるため、Autumnの行を選択する必要があります。同様に、bの場合は、が最大であるため、Winterの行を選択する必要があります。同様に、dの場合、Summerの行を選択する必要があります。areaが最大であるからです。

したがって、最後の行列(またはデータフレーム)は、a,b,c,dの1つの行を持つ必要があります。しかし、上記のループを実行すると、dの行だけが表示され、他の3つの行は表示されません。私はこれが最後の行の行と関係があると思います。それは、行列results.matを満たしていて、前の選択を上書きします。しかし、マトリックスについてはわかりませんが、どのように行を行で埋めるべきですか?

おかげ

+0

行列とdata.framesが異なっています。 data.frameの行を選択したい場合、結果は/でなければなりません(以下の答えのように)。 – Frank

+0

ベースの1つのオプションR: 'dat [as.logical(ave(dat $ reg、dat $ year、FUN = function(x)x == max(x)、drop = TRUE))、 – nicola

答えて

2

溶液である:

library(data.table) 
setDT(dat) 

# subset data according to max area by reg-year 
dat[, .SD[which.max(area),], by=c("reg", "year")] 
1

あなたが説明したようresult.matはあなたが望むものであるならば、あなたはグループやフィルタに基づいてデータを操作することを可能にするなどdplyrとして、いくつかのデータ操作パッケージを使用することによってそれを行うのより体系的な方法は、ありますいくつかの条件を満たす行。 dplyrパッケージでは、次のようにresult.matを達成することができます。次のようにdata.tableパッケージを使用

library(dplyr); 
dat %>% group_by(reg, year) %>% filter(area == max(area)) 

Source: local data frame [4 x 6] 
Groups: reg, year [4] 

    reg year sea  area  prod  yld 
    (chr) (int) (chr)  (dbl)  (dbl)  (dbl) 
1  a 2005 Autumn 0.5728534 0.7698414 0.01339033 
2  b 2006 Winter 0.9082078 0.4976992 0.38238796 
3  c 2007 Winter 0.9446753 0.3800352 0.48208012 
4  d 2008 Summer 0.2059746 0.6516738 0.82737332 
+0

もう一つの標準オプションは、 'filter'の代わりに'%>%slice(which.max(area)) 'です。 – Frank

関連する問題