三维坐标分块算法(R或任何其他语言)

三维坐标分块算法(R或任何其他语言),r,algorithm,3d,coordinates,binning,R,Algorithm,3d,Coordinates,Binning,我正在尝试存储三维坐标 我有一个分子在蛋白质中运动的坐标,来自800多个模拟。。。我要做的是把这些数据放在一个箱子里,得到平均值、方差和我在箱子里有多少个点 我想是这样的: 包含我的三维坐标的空间被分割成由breaks()定义的更小的三维立方体(三维箱) 我需要的是这些较小的3D容器中的所有x、y、z坐标,以计算这些数据的平均值和方差 这有意义吗 非常感谢您的帮助 我的输入如下所示: x<-c(1.1,1.2,4.3) y<-c(3.4,5,2,3.2) z<-c(10.1,1

我正在尝试存储三维坐标

我有一个分子在蛋白质中运动的坐标,来自800多个模拟。。。我要做的是把这些数据放在一个箱子里,得到平均值、方差和我在箱子里有多少个点

我想是这样的: 包含我的三维坐标的空间被分割成由breaks()定义的更小的三维立方体(三维箱)

我需要的是这些较小的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)

给你。我可能完全错了,但是如果没有一些预期的结果,你的问题很难回答。我继续计算每个小立方体的均值和方差,所以创建了一个分组变量

#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
#使用更多的点和值生成一些数据
种子集(32587)
n=500

dat你能展示一个预期的输出吗?我不确定你的代码背后的逻辑实际上你的问题是为了完成它,评论不是为了这个。请纠正我自己,如果它是一个立方体,每边分成10个部分,箱子应该是1000个条目的列表。我还是不明白你的代码逻辑对你的描述顺便说一句。你是正确的。。。因为在这个例子中我只有3个坐标。(所以10x10x10个箱子条目)我的代码逻辑很可能有缺陷。我根本不是一个程序员,我是一个喜欢计算机的生化学家;)亲爱的赫罗卡,谢谢。我不需要聚合“value”变量,但我想计算每个小立方体中坐标的均值和方差。我如何优雅地做到这一点(没有for循环)?我也需要用我的完整数据集来测试它,可能需要一段时间…所以要清楚:你们有一个比你们用整数表示的更连续的坐标变量,你们想要每个立方体中坐标的均值和方差吗?请让我知道这是否适用于你们。我已经更改了数据生成机制和编号,以便更多地填充垃圾箱。Heroka,它起作用了!:D非常感谢。我现在很高兴,不客气。如果您将来有新问题,请考虑您的输入和预期输出的形式:)。
#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))
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))