繁体   English   中英

在 R 中对遵循序列 N+1 的数据进行分组

[英]Grouping data that follows sequence N+1 in R

所以我有一个包含三列的数据集:position、时间和强度。 强度充满了二进制值,我已过滤为仅包含 1(因为这代表感兴趣的 object,而 0 是背景)。

我需要一种方法能够将数据分组为 N+1 之后的序列; 请参考下图。

我的数据快照

如您所见,第一列从 4 到 22,以 1 为增量跳到 39,在我的数据集中有很多这样的情况(每个跳过代表一个 object 的结束和另一个的开始)有没有办法找到序列 N+1 之后的数字的位置,然后将其分组到一个变量中,从而使我能够识别每个 object 的位置。

编辑//

在回复之后,我使用了代码并生成了这个,它生成了另一列(称为 T2),其中包含数字:

structure(list(pixel_pos = c(4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 39L), 
    Time_point = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1), Intensity = c(1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), T2 = c(1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    2L)), row.names = c(NA, -20L), class = c("tbl_df", "tbl", 
"data.frame")) 

有没有办法将 T2 中所有跟随在 1、2、3 等后面的数字分组,因为它们代表对象。 再次感谢!

//EDIT 2 原始表,没有过滤(0 存在)

Pixel_pos = 1:40, 
Time_point = c(1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), 
Intensity = c(0, 0, 
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1)), 
row.names = c(NA, 40L), class = c("tbl_df", "tbl", "data.frame"))

很多方法,这里有两种(调用你的数据df ):

df$group = as.integer(factor(df$first_column - 1:nrow(df)))

df$group = cumsum(c(1, diff(df$first_column) > 1))

如果您遇到这些问题或需要更多帮助,请以可重现的方式分享您的一些数据——数据图片很难处理。 例如, dput(df[1:20, ])给出了数据框前 20 行的可复制粘贴版本。

我不确定我是否能很好地理解你的问题,如果没有可重复的例子,真的很难提供帮助

无论如何,我将提供一个 data.table 解决方案:

虚拟数据

set.seed(1)
dt <- data.table(x = 1:100, y = sample(0:1, 100, TRUE, prob = c(.3, .6)))

然后我们:

dt[, id := rleid(y)][, startPos := ifelse(id != shift(id, 1), 1, 0)][y == 1 & startPos == 1, ]

里面有什么:

  • id:= rleid(y) :我们创建一个新的变量id ,它具有变量 y 的运行长度 id,即它的连续运行,非常接近你想要的。
  • startPos:= ifelse(id,= shift(id, 1), 1, 0) :我们创建一个新变量startPos ,如果id与下一个不同,则该变量将为 1(从而标记此类 id 的起始 position) .
  • 最后,我们过滤那些具有y == 1 (您感兴趣的数据)和startPos == 1 (起始位置)的结果。 dt仍然拥有所有原始数据。

希望能帮助到你

如果你对dplyr ,我们可以用lag function 来简化这个过程。 这特别有用,因为我们可以为第一行设置默认值。

library(dplry)
data %>% 
  mutate(T2 = cumsum(pixel_pos - lag(pixel_pos, default = 0) > 1))
# A tibble: 20 x 4
   pixel_pos Time_point Intensity    T2
       <int>      <dbl>     <dbl> <int>
 1         4          1         1     1
 2         5          1         1     1
 3         6          1         1     1
...
18        21          1         1     1
19        22          1         1     1
20        39          1         1     2

我设法让一切正常使用

df$group = as.integer(因子(df$first_column - 1:nrow(df)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM