我有一个尺寸为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