【问题标题】:group variables depending on defined circular area with center of circle having variable radius根据定义的圆形区域对变量进行分组,其中圆心具有可变半径
【发布时间】:2016-09-15 12:58:25
【问题描述】:

我有一个数据表对象:

> dput(head(trackdatacompvar))
structure(list(wellvid = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("A4-009", 
"B3-006", "B4-015", "C2-009", "C2-034", "C3-017", "C4-014", "C4-016", 
"C4-026", "C4-036"), class = "factor"), TRACK_ID = c(0L, 0L, 
0L, 0L, 0L, 0L), treatment = structure(c(2L, 2L, 2L, 2L, 2L, 
2L), .Label = c("Si_induced", "Si_notinduced"), class = "factor"), 
    A = c(0L, 0L, 0L, 0L, 0L, 0L), X = c(50.216, 50.216, 50.091, 
    50.091, 50.216, 50.216), Y = c(295.609, 295.609, 295.477, 
    295.477, 295.609, 295.609), T = 0:5, V = c(0, 0, 0.181793839279557, 
    0, 0.181793839279557, 0), x_grpA = c(641.67, 641.67, 641.67, 
    641.67, 641.67, 641.67), y_grpA = c(625, 625, 625, 625, 625, 
    625), rad_grpA = c(50L, 50L, 50L, 50L, 50L, 50L), x_grpB = c(889.58, 
    889.58, 889.58, 889.58, 889.58, 889.58), y_grpB = c(377.08, 
    377.08, 377.08, 377.08, 377.08, 377.08), rad_grpB = c(20L, 
    20L, 20L, 20L, 20L, 20L)), .Names = c("wellvid", "TRACK_ID", 
"treatment", "A", "X", "Y", "T", "V", "x_grpA", "y_grpA", "rad_grpA", 
"x_grpB", "y_grpB", "rad_grpB"), sorted = "wellvid", class = c("data.table", 
"data.frame"), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x0000000000210788>)

我想根据圆形区域定义 4 组数据。 A 组和 B 组将取决于 2 个珠子的 x,y 原点(标记为 x_grpA、y_grpA 和 x_grpB、y_grpB),C 组是外部区域,D 组是 A 组和 B 组重叠的区域(但该区域有时不存在)。 2 个圆形组应位于半径为 115 µm 的圆形区域内。这 115 µm 取决于珠子的大小,所以我的数据中也有 2 个半径(rad_grpA 和 rad_grpB)。为了直观理解,这里有两张图片:

我最初的想法是重复使用before 给我的很棒的脚本。所以,我尝试将每个数据点的中心和A组整个区域的相应长度定义为:

center_grpA <- c(trackdatacompvar$x_grpA, trackdatacompvar$y_grpA)
circle_grpA <- (trackdatacompvar$rad_grpA)*2 + 115

但是在这之后我迷路了。 最后,我想将它们的分组放在我的数据框中作为一个变量。 将不胜感激任何帮助!谢谢:)

【问题讨论】:

    标签: r data.table subset geometry


    【解决方案1】:

    我们可以使用我here的一个包中的一些便利功能:

    check_if_in_circle <- function(points, x, y, r) {
      (points[, 1] - x) ^ 2 + (points[, 2] - y) ^ 2 < r ^ 2
    }
    

    现在我们检查每个点,无论是在 A 圈还是 B 圈,然后 ifelse 以确定是分配 A、B、C 还是 D。我使用 within 来避免输入那个长数据名称.

    trackdatacompvar <- within(trackdatacompvar,
                               { 
                                 grpA <- check_if_in_circle(points = cbind(X, Y), 
                                                            x_grpA, y_grpA, rad_grpA + 115)
                                 grpB <- check_if_in_circle(points = cbind(X, Y), 
                                                            x_grpB, y_grpB, rad_grpB + 115)
                                 grp <- ifelse(grpA, ifelse(grpB, 'D', 'A'),
                                               ifelse(grpB, 'B', 'C'))
                               } )
    

    你给我们的那几行,都在C组。

    【讨论】:

    • 对不起这个例子,它只是一个大数据框的标题(~750k 数据点)。我得到了 grpA 和 grpB 的 TRUE 或 FALSE 语句,应该是这样吗?因为我想要的是将组作为单列变量。谢谢!
    • 是的,你可以只使用最后一个 grp 列,而忽略 grpA 和 grpB。这个例子很好。
    • 我错过了grp专栏!再次感谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2014-02-28
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多