【问题标题】:algorithm for binning of 3D coordinates (in R or any other language)3D 坐标分箱算法(R 或任何其他语言)
【发布时间】:2015-10-20 09:03:31
【问题描述】:

我正在尝试合并 3D 坐标。

我从 800 多次模拟中获得了一个分子在蛋白质中移动的坐标...我想要对这些数据进行分箱以获得平均值、方差以及我在一个分箱中有多少点。

我想象它是这样的: 包含我的 3D 坐标的空间被分成更小的 3D 立方体(3D 箱),由 break() 定义。

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

并且输出应该由带有 dat 的 bin 组织,其中包含坐标所属的 bin 的附加信息:

x y y bin_x bin_y bin_z

【问题讨论】:

  • 你能显示预期的输出吗?我不确定你的代码背后的逻辑实际上是什么
  • edit 你的问题来完成它,cmets 不适合这个。
  • 更正我自己,如果它是一个每边分成 10 部分的立方体,BIN 应该是一个包含 1000 个条目的列表。顺便说一句,我仍然没有根据你的描述得到你的代码逻辑。
  • 你是正确的......因为我在这个示例集中只有 3 个坐标。 (所以 BIN 中有 10x10x10 个条目)
  • 我的代码逻辑很可能有很大缺陷。根本不是程序员,是喜欢电脑的生化学家;)

标签: r algorithm 3d coordinates binning


【解决方案1】:

给你。我在这里可能完全错了,但是如果没有一些预期的输出,你的问题很难回答。我继续您计算每个小立方体的均值和方差的意图,因此创建了一个分组变量。

#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

【讨论】:

  • 亲爱的希罗卡,谢谢。我不需要聚合“值”变量,但我想计算每个小立方体中坐标的均值和方差。我该如何优雅地做到这一点(没有 for 循环)?我也需要用我的完整数据集对其进行测试,可能需要一段时间......
  • 所以要明确一点:你有一个比你用整数表示的更连续的坐标变量,你想要每个立方体中坐标的均值和方差?
  • 如果这对你有用,请告诉我。我已经更改了数据生成机制和数量,以便更多地填充垃圾箱。
  • Heroka,它有效! :D 非常感谢。我现在很开心。
  • 不客气。如果您将来有新问题,请考虑一下您的输入和预期输出的形式:)。
【解决方案2】:
#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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2011-03-28
    相关资源
    最近更新 更多