确定网格的每个单元格内的点,并向数据集添加新列

时间:2017-12-06 19:45:14

标签: r dataframe grid-layout

我有一个数据框sink configuration,每个0.1单位有一个点:

df

我定义了一个新的数据框df <- expand.grid(x = seq(0, 20, by = .1), y = seq(0, 20, by = .1)) ,每4个单位有一个点:

grid

我想使用grid <- expand.grid(xg = seq(0, 20, by = 4), yg = seq(0, 20, by = 4)) 的点作为网格的节点,并确定grid其单元格中的点。 有关网格单元格的信息应添加到df中的新列中,为每个点提供df字符串,其中i.ji是行和列分别为j单元格的索引。新列应在grid行上为NA点报告df

例如,所有grid点都为0&lt; x&lt; 4和0&lt; y&lt; 4应该标记为df,而8标记为{1}。 x&lt; 12和16&lt; y&lt; 20应标记为1.1,依此类推。

理想的解决方案对于不同大小的网格也应该没问题,即3.5

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这有点hacky,但您可以在i.j中创建grid索引,然后将其加入df并填充每个网格块的NA:

df <- expand.grid(x = seq(0, 20, by = .1),
                  y = seq(0, 20, by = .1))
head(df)
#>     x y
#> 1 0.0 0
#> 2 0.1 0
#> 3 0.2 0
#> 4 0.3 0
#> 5 0.4 0
#> 6 0.5 0

grid <- expand.grid(xg = seq(0, 20, by = 4),
                    yg = seq(0, 20, by = 4))
head(grid)
#>   xg yg
#> 1  0  0
#> 2  4  0
#> 3  8  0
#> 4 12  0
#> 5 16  0
#> 6 20  0

# Make row/col indices
grid$i <- as.integer(factor(grid$xg))
grid$j <- as.integer(factor(grid$yg))
grid$i.j <- paste(grid$i, grid$j, sep = '.')
grid$i <- NULL
grid$j <- NULL

# Merge indices to df
indexed <- merge(df, grid, by.x = c('x', 'y'), by.y = c('xg', 'yg'), all = TRUE)
head(indexed)
#>   x   y i.j
#> 1 0 0.0 1.1
#> 2 0 0.1  NA
#> 3 0 0.2  NA
#> 4 0 0.3  NA
#> 5 0 0.4  NA
#> 6 0 0.5  NA

# Fill in betweens
for (i in 2:nrow(indexed)) {
  if (is.na(indexed$i.j[i])) {
    indexed$i.j[i] <- indexed$i.j[i - 1]
  }
}
head(indexed)
#>   x   y i.j
#> 1 0 0.0 1.1
#> 2 0 0.1 1.1
#> 3 0 0.2 1.1
#> 4 0 0.3 1.1
#> 5 0 0.4 1.1
#> 6 0 0.5 1.1

这仅在df序列与grid序列相交时才有效,即df[8081, ] = {4.0, 4.0}位于griddf[1, ]也位于grid }。

此外,for循环非常慢。您可以尝试将其转换为Rcpp循环,也可以使用{data.table}{sqldf}

进行非等效加入