R 在循环中按行填充矩阵

R 在循环中按行填充矩阵,r,for-loop,matrix,R,For Loop,Matrix,我试图运行一个循环并填充一个矩阵。以下是一个示例数据: #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.f

我试图运行一个循环并填充一个矩阵。以下是一个示例数据:

#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如果您所描述的
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

如果您所描述的
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

使用
数据的解决方案。表
包如下:

library(data.table)
setDT(dat)

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

使用
数据的解决方案。表
包如下:

library(data.table)
setDT(dat)

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

矩阵和数据帧是不同的。如果要选择data.frame的行,结果也将/应该是data.frame(如下面的答案所示)。base R中的一个选项:
dat[as.logical(ave(dat$area,dat$reg,dat$year,FUN=function(x)x==max(x),drop=TRUE)),]
矩阵和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)),]
另一个标准选项是
%>%slice(which.max(area))
而不是
过滤器
。另一个标准选项是
%%>%切片(which.max(area))
而不是
过滤器