【问题标题】:fill a matrix by row in a loop在循环中逐行填充矩阵
【发布时间】: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 的行,因为areaarea 的所有三个值中是最大值。同样,对于b,应该选择Winter 的行,因为area 是最大值。同样,对于d,应该选择Summer 的行,因为area 是最大值。

因此,最终矩阵(或数据框)应该有一行用于abcd。但是,当我运行上面的循环时,它只给了我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)),]

标签: r for-loop matrix


【解决方案1】:

使用data.table包的解决方案如下:

library(data.table)
setDT(dat)

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

【讨论】:

    【解决方案2】:

    如果您所描述的result.mat 是您想要的,那么有一种更系统的方法可以通过使用一些数据操作包(例如dplyr)来实现,它允许您根据组操作数据并过滤行满足一些条件。在dplyr包中,可以通过以下方式实现result.mat

    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
    

    【讨论】:

    • 另一个标准选项是%&gt;% slice(which.max(area)),而不是filter
    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 2013-01-19
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    相关资源
    最近更新 更多