R:单细胞跟踪 X 和 Y 坐标(位置)随时间变化
R: Single Cell tracking X and Y coordinates (Position) changes during time course
我有两个数据帧(1 分钟时间点和 26 分钟时间点)。
我有 PosX
和 PosY
(检测到的所有细胞在特定时间点图像中的 X 和 Y 位置)和我感兴趣的读数
随着时间的推移,细胞会轻微迁移。我使用以下方法计算了 X 和 Y(delta_x
和 delta_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)
如何通过允许 PosX
落入 Xmax
和 Xmin
范围内来找到 DF_26min
中的哪些单元格对应于 DF_1min
中的单元格DF_1min 和 PosY 中的单元格落在 Ymax 和 Ymin 范围内?
也许更好的解决方案可能是下一个最近邻解决方案,但这听起来可能超出了要求。
我在 Whosebug 上尝试了大量线程问题,但即使使用管道,我整个周末都在绞尽脑汁。
非常感谢您花时间阅读这个问题。这对我博士的最后一部分真的很有帮助。
马克.
对于 DF_26min
中的每个单元格位置,在 DF_1min
中找到 最近的 ]:
distance 函数基于 euclidean 距离,从点 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
功能,以便轻松实现其他距离测量。 "manhattan"、"canberra"、"binary" 或 "minkowski" 等
# 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
和 PosY
是独立的 和 point-wise 在其 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
我有两个数据帧(1 分钟时间点和 26 分钟时间点)。
我有 PosX
和 PosY
(检测到的所有细胞在特定时间点图像中的 X 和 Y 位置)和我感兴趣的读数
随着时间的推移,细胞会轻微迁移。我使用以下方法计算了 X 和 Y(delta_x
和 delta_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)
如何通过允许 PosX
落入 Xmax
和 Xmin
范围内来找到 DF_26min
中的哪些单元格对应于 DF_1min
中的单元格DF_1min 和 PosY 中的单元格落在 Ymax 和 Ymin 范围内?
也许更好的解决方案可能是下一个最近邻解决方案,但这听起来可能超出了要求。
我在 Whosebug 上尝试了大量线程问题,但即使使用管道,我整个周末都在绞尽脑汁。
非常感谢您花时间阅读这个问题。这对我博士的最后一部分真的很有帮助。
马克.
对于
DF_26min
中的每个单元格位置,在DF_1min
中找到 最近的 ]:distance 函数基于 euclidean 距离,从点
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
功能,以便轻松实现其他距离测量。 "manhattan"、"canberra"、"binary" 或 "minkowski" 等# 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
和PosY
是独立的 和 point-wise 在其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