用于 3D 坐标分箱的算法(用 R 或任何其他语言)
algorithm for binning of 3D coordinates (in R or any other language)
我正在尝试对 3D 坐标进行分箱。
我有一个分子在蛋白质中移动的坐标,来自 800 多次模拟...我想要的是对这些数据进行分箱以获得均值、方差以及我在分箱中有多少点。
我想象是这样的:
包含我的 3D 坐标的 space 被分成由 breaks() 定义的更小的 3D 立方体(3D 箱)。
我需要的是这些较小的 3D 容器中的所有 x、y、z 坐标,以计算这些数据的均值和方差。
这有意义吗?
非常感谢任何帮助。
我的输入是这样的:
x<-c(1.1,1.2,4.3)
y<-c(3.4,5,2,3.2)
z<-c(10.1,10.3,12)
dat <- data.frame(x=x,y=y,z=z)
并且输出应按 bins 组织,其中 dat 具有关于坐标属于哪个 bin 的附加信息:
x y y bin_x bin_y bin_z
给你。我在这里可能完全错了,但如果没有一些预期的输出,你的问题很难回答。我继续你计算每个小立方体的均值和方差的意图,所以创建了一个分组变量。
#generate some data with some more points and a vale
set.seed(32587)
n=500
dat <- data.frame(x=runif(n,min=0,max=10),
y=runif(n,min=0,max=10),
z=runif(n,min=0,max=10))
#create bins (using 'cut', no need to do this manually or in a loop)
#I have removed the labels, so each bin is just a number.
#breaks have been changed to allow for actual binning
breaks<-seq(0,10,1)
dat$bin_x <- cut(dat$x, breaks=breaks, labels=F)
dat$bin_y <- cut(dat$y, breaks=breaks, labels=F)
dat$bin_z <- cut(dat$z, breaks=breaks, labels=F)
#create grouping variable with some string formatting for readability
dat$bin_all <- with(dat, sprintf("%02d.%02d.%02d",bin_x,bin_y,bin_z))
head(dat)
library(data.table)
m_dat <- melt(setDT(dat),measure.vars=c("x","y","z"))
res <- m_dat[,.(mean_value=mean(value),variance_value=var(value),
n_value=.N),by=list(bin_all,variable)]
res
#Matrix of bins
mat <- cbind(rep(1:10, each = 100), rep(rep(1:10, each = 10), 10), rep(1:10, 100))
Data Frame of coordinates
df1 <- data.frame(x = c(1,3), y = c(2,6), z = c(8,10))
输出匹配df1行的3个值的mat行
apply(apply(df1, 1, function(x)
apply(mat,1, function(y)
sum(x[1] == y[1], x[2] == y[2], x[3] == y[3])) ), 2,
function(z) which(z ==3))
我正在尝试对 3D 坐标进行分箱。
我有一个分子在蛋白质中移动的坐标,来自 800 多次模拟...我想要的是对这些数据进行分箱以获得均值、方差以及我在分箱中有多少点。
我想象是这样的: 包含我的 3D 坐标的 space 被分成由 breaks() 定义的更小的 3D 立方体(3D 箱)。
我需要的是这些较小的 3D 容器中的所有 x、y、z 坐标,以计算这些数据的均值和方差。
这有意义吗?
非常感谢任何帮助。
我的输入是这样的:
x<-c(1.1,1.2,4.3)
y<-c(3.4,5,2,3.2)
z<-c(10.1,10.3,12)
dat <- data.frame(x=x,y=y,z=z)
并且输出应按 bins 组织,其中 dat 具有关于坐标属于哪个 bin 的附加信息:
x y y bin_x bin_y bin_z
给你。我在这里可能完全错了,但如果没有一些预期的输出,你的问题很难回答。我继续你计算每个小立方体的均值和方差的意图,所以创建了一个分组变量。
#generate some data with some more points and a vale
set.seed(32587)
n=500
dat <- data.frame(x=runif(n,min=0,max=10),
y=runif(n,min=0,max=10),
z=runif(n,min=0,max=10))
#create bins (using 'cut', no need to do this manually or in a loop)
#I have removed the labels, so each bin is just a number.
#breaks have been changed to allow for actual binning
breaks<-seq(0,10,1)
dat$bin_x <- cut(dat$x, breaks=breaks, labels=F)
dat$bin_y <- cut(dat$y, breaks=breaks, labels=F)
dat$bin_z <- cut(dat$z, breaks=breaks, labels=F)
#create grouping variable with some string formatting for readability
dat$bin_all <- with(dat, sprintf("%02d.%02d.%02d",bin_x,bin_y,bin_z))
head(dat)
library(data.table)
m_dat <- melt(setDT(dat),measure.vars=c("x","y","z"))
res <- m_dat[,.(mean_value=mean(value),variance_value=var(value),
n_value=.N),by=list(bin_all,variable)]
res
#Matrix of bins
mat <- cbind(rep(1:10, each = 100), rep(rep(1:10, each = 10), 10), rep(1:10, 100))
Data Frame of coordinates
df1 <- data.frame(x = c(1,3), y = c(2,6), z = c(8,10))
输出匹配df1行的3个值的mat行
apply(apply(df1, 1, function(x)
apply(mat,1, function(y)
sum(x[1] == y[1], x[2] == y[2], x[3] == y[3])) ), 2,
function(z) which(z ==3))