如何将立方体划分为特定的网格数,并在r中找到每个网格中的元素

  • 本文关键字:网格 元素 并在 划分 立方体 r
  • 更新时间 :
  • 英文 :


我有一个尺寸为5*5*5m^3的立方体,立方体中充满了不同的元素(氧气、碳等(,坐标的数据集看起来像这样-

element   x     y     z

Oxygen    1     1     1.2
hydrogen  2.2   2     2.3
oxygen    4.3   3     3
carbon    4     2.3   5
oxygen    3.3   3.5   3

现在我想把整个立方体分成0.5*0.5*0.5 m^3的网格,并找出这些网格中有多少在z的某个区域内含有氧气(比如有多少网格中有氧气(从z=0到z=0.5(,从z=0.5到z=1(等等。(

现在我做了以下操作,如果可能的话,我想简化它。我们将不胜感激。

divide <- function(z1, z2, y1, y2, x1, x2){
oxygen_number <- dt %>% filter(dt$element == 'oxygen' & dt$z >= z1 & dt$z < z2 & dt$y >= y1 & dt$y < y2 & dt$x >= x1 & dt$x < x2) %>% count()
}
seqx<- seq(0, 5, 0.5)
seqy<- seq(0, 5, 0.5)
by_z <- function(k){
result = c()
for (l in seqx) {
for (m in seqy){
PP1 <- divide(k, k+0.5, l, l+0.5, m, m+0.5)
print(PP1)
result <- rbind(result, PP1)
}
}
}
by_z1 <- by_z(0, 0.5)
by_z2 <- by_z(0.5, 1)

您可以使用cut查看元素所在的网格:

library(dplyr)
set.seed(123)
dtt <- data.frame(
element = sample(c('C', 'H', 'O'), 10000, replace = TRUE),
x = runif(10000, 0, 5),
y = runif(10000, 0, 5),
z = runif(10000, 0, 5))
dtt %>%
mutate(
xbin = cut(x, breaks = seq(0, 5, 0.5), include.lowest = TRUE),
ybin = cut(y, breaks = seq(0, 5, 0.5), include.lowest = TRUE),
zbin = cut(z, breaks = seq(0, 5, 0.5), include.lowest = TRUE)) %>%
group_by(xbin, ybin, zbin, element) %>%
tally()
# # A tibble: 2,911 x 5
# # Groups:   xbin, ybin, zbin [1,000]
#    xbin    ybin    zbin    element     n
#    <fct>   <fct>   <fct>   <fct>   <int>
#  1 [0,0.5] [0,0.5] [0,0.5] C           3
#  2 [0,0.5] [0,0.5] [0,0.5] H           9
#  3 [0,0.5] [0,0.5] [0,0.5] O           7
#  4 [0,0.5] [0,0.5] (0.5,1] C           5
#  5 [0,0.5] [0,0.5] (0.5,1] H           2
#  6 [0,0.5] [0,0.5] (0.5,1] O           1
#  7 [0,0.5] [0,0.5] (1,1.5] C           5
#  8 [0,0.5] [0,0.5] (1,1.5] H           3
#  9 [0,0.5] [0,0.5] (1,1.5] O           6
# 10 [0,0.5] [0,0.5] (1.5,2] C           4
# # … with 2,901 more rows

最新更新