考虑以下数据框:
> df <- data.frame(x=sample(c(0,1),9,replace=T))
> df$x <- factor(df$x)
> df
x
1 1
2 1
3 0
4 1
5 0
6 0
7 0
8 1
9 1
让我们说它来自二元逻辑回归输出(0,1),我想在3x3栅格中对其进行转换。在此之前,我需要一个3x3数据帧或一个数组。我怎样才能达到这个结果:
df
[,1] [,2] [,3]
[1,] 1 1 0
[2,] 1 0 0
[3,] 0 1 1
修改
谢谢@A。韦伯为你发表评论。我还没有提到额外的任务。我有一个大的数据框(994704行),我应该根据另一个字段(数字)分为23个204x212矩阵或数组(每行43248行),让我们说&#34; y&#34;,按顺序转换为栅格:
> df
y x
1 27 1
2 27 1
3 27 0
4 27 1
5 27 0
6 27 0
7 27 0
8 27 1
9 27 1
10 27.5 1
11 27.5 1
12 27.5 0
13 27.5 1
14 27.5 0
15 27.5 0
16 27.5 0
17 27.5 1
18 27.5 1
...
994704 38 1
我的理由,即使我不确定如何实现它,也就是:
for (i in unique(df$y)){
df.new.[i] <- raster(matrix(df$x[each 43248 rows],204,212,byrow=T))
}
因此它应该导致23个栅格(204x212)命名为df.new。[y value]。根据我的挑战,这是一个更现实的例子。
答案 0 :(得分:2)
基本上你有一个数字向量(不要把它变成一个因子)
#dfx <- as.numeric(df$x)
dfx <- runif(994704)
现在你可以做到
library(raster)
b <- brick(nrow=204,ncol=212,nl=23)
values(b) <- dfx
RasterBrick
&#39; b&#39;比RasterLayer
对象列表更方便;但如果这就是你所需要的:
bs <- unstack(b)
这假设值的顺序正确(栅格为栅格,栅格内左上角为行)
您设想的子集化方法类似于
#example data
y <- rep(1:23, each=204*212)
df <- data.frame(x=dfx, y=y)
现在做
r <- raster(nrow=204,ncol=212)
x <- list()
for (i in unique(df$y)) {
v <- df[df$y==i, 'x']
x[[i]] <- setValues(r, v)
}
s <- stack(x)