R - " Unmelt"熔化的数据帧回到原始尺寸

时间:2016-03-28 21:21:34

标签: r data-manipulation

考虑以下数据框:

> 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]。根据我的挑战,这是一个更现实的例子。

1 个答案:

答案 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)