R:单细胞跟踪X和Y坐标(位置)在时间过程中发生变化

时间:2018-06-10 22:56:56

标签: r time coordinates variation

我有两个数据帧(1分钟时间点和26分钟时间点)。

我有PosXPosY(在特定时间点图像中检测到所有细胞的X和Y位置)和我感兴趣的读数

加班,细胞稍微迁移。我使用以下方法计算了X和Y(delta_xdelta_y)的变化:

delta_x <-  median_x_0nM_26min - median_x_0nM_1min 
delta_y <-  median_y_0nM_26min - median_y_0nM_1min 

然后我将此更改添加到我的起始X和Y值

Xmax <- DF_1min$PosX + delta_x
Xmin <- DF_1min$PosX - delta_x
Ymax <- DF_1min$PosY + delta_Y
Ymin <- DF_1min$PosY - delta_Y

DF_1min <- cbind(DF_1min, Xmax, Xmin, Ymax, Ymin)

如何DF_26min允许DF_1min属于PosXXmax范围内的单元格,Xmin中哪些单元格与class App中的单元格相对应? DF_1min和PosY是否在Ymax和Ymin范围内?

或许更好的解决方案可能是下一个最近邻解决方案,但这听起来可能超出了要求。

我已经在StackOverflow上尝试了大量的线程问题,但即使是管道问题,我整个周末一直在讨论这个问题。

非常感谢您花时间阅读这个问题。这对我博士的最后部分真的有帮助。

标记。

1 个答案:

答案 0 :(得分:0)

  • 要查找DF_1min中的 ,请DF_26min中的每个单元格位置:

    基于欧几里德距离的

    距离函数,从点x到集合/数据框df

    distance <- function(x, df = DF_1min) {
    apply( df[,c('PosX','PosY')], 1, function(y) {diff <- (y - x); sqrt(sum(diff^2))} )
                                          }
    
    # calculating nearest/ min distance for every cell position in DF_26min
    nearest <- apply( DF_26min, 1, function(y) which.min(x = distance(y)) )
    

    您还可以查看dist功能,以便轻松实施其他距离测量。 &#34;曼哈顿&#34;,&#34;堪培拉&#34;,&#34;二进制&#34;或者&#34; minkowski&#34;等

    # Nearest indices from DF_1min and corresponding X, Y positions
    DF_26min['Nearest'] <- nearest
    DF_26min[,c('Nearest_Pos_X', 'Nearest_Pos_Y')] <- DF_1min[nearest,c('PosX', 'PosY')]
    
  • 要在 26分钟进行检查,请PosX&amp; PosY 独立 逐点 在其nearest点的范围内,你可以这样做以获得相等长度的逻辑向量:

    DF_26min[,'X_Inrange'] <- ((DF_26min$PosX >= DF_1min[nearest,'Xmin']) & (DF_26min$PosX <= DF_1min[nearest,'Xmax']))
    DF_26min[,'Y_Inrange'] <- ((DF_26min$PosY >= DF_1min[nearest,'Ymin']) & (DF_26min$PosY <= DF_1min[nearest,'Ymax']))
    DF_26min[,'PXY_Inrange'] <- (rowSums(DF_26min[,c('X_Inrange','Y_Inrange')]) == 2)
    
  • 用于查找在范围内最近的单元格/位置:NIR

    Nearest_IR <- function(x, df = DF_1min) {
    
         n <- nrow(df)
         X_Inrange <- ((rep(x[1],n) >= DF_1min[,'Xmin']) & (rep(x[1],n) <= DF_1min[,'Xmax']))
         Y_Inrange <- ((rep(x[2],n) >= DF_1min[,'Ymin']) & (rep(x[2],n) <= DF_1min[,'Ymax'])) 
         XY_Inrange <- (rowSums(cbind(X_Inrange,Y_Inrange)) == 2)  
         distance <- apply( df[,c('PosX','PosY')] , 1 , function(y) {diff <- (y - x) ; sqrt(sum(diff^2))} )
    
         df_temp <- cbind(ID = seq.int(n), df, XY_Inrange, distance)
    
         if (sum(df_temp$XY_Inrange == TRUE) == 0 ){
         return (NA)   
         } else {
         NIR <- df_temp$ID[df_temp$distance == min(df_temp$distance[df_temp$XY_Inrange == TRUE])]
         return (NIR)  }  
                                              }
    
    DF_26min[,'Nearest_IR'] <- apply( DF_26min, 1, Nearest_IR )
    
    DF_26min[,c(1:3,8,9)]
    # PosX  PosY    Nearest PXY_Inrange Nearest_IR
    # 1.0   0.0     5           FALSE   NA
    # 2.0   1.0     2           TRUE    2
    # 1.5   2.0     3           TRUE    3
    # 2.2   0.5     4           FALSE   5 
    

    数据:

    DF_26min = data.frame(PosX = c(1,2,1.5,2.2) , PosY = c(0,1,2,0.5))
    DF_1min <- data.frame(PosX = c(4.2,2.1,1.8,2.1,2.05) , PosY = c(0.2,1.1,2.15,0.6,0.5))
    DF_1min['Xmin'] <- DF_1min['PosX']*0.8
    DF_1min['Xmax'] <- DF_1min['PosX']*1.1
    DF_1min['Ymin'] <- DF_1min['PosY']*0.9
    DF_1min['Ymax'] <- DF_1min['PosY']*1.2