我有一个数据框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.j
和i
是行和列分别为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
。
感谢您的帮助。
答案 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}
位于grid
且df[1, ]
也位于grid
}。
此外,for
循环非常慢。您可以尝试将其转换为Rcpp
循环,也可以使用{data.table}
或{sqldf}