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))
而不是过滤器
。