序列N+之后的分组数据;1英寸R

序列N+之后的分组数据;1英寸R,r,R,所以我有一个数据集,它有三列:位置、时间和强度。强度充满了二进制值,我已经过滤到只包含1(因为这表示感兴趣的对象,而0是背景) 我需要一种能够将数据分组为N+1之后的序列的方法;请参阅下图 如您所见,第一列从4变为22,以1为增量,然后再跳到39。在我的数据集中,有许多这样的情况(每个跳过代表一个对象的结束和另一个对象的开始)有没有一种方法可以找到N+1序列后面的数字的位置,然后将其分组成一个变量,这样我就可以识别每个对象的位置 编辑// 在回答之后,我使用了代码,它生成了这个,它生成了另一列

所以我有一个数据集,它有三列:位置、时间和强度。强度充满了二进制值,我已经过滤到只包含1(因为这表示感兴趣的对象,而0是背景)

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

如您所见,第一列从4变为22,以1为增量,然后再跳到39。在我的数据集中,有许多这样的情况(每个跳过代表一个对象的结束和另一个对象的开始)有没有一种方法可以找到N+1序列后面的数字的位置,然后将其分组成一个变量,这样我就可以识别每个对象的位置

编辑//

在回答之后,我使用了代码,它生成了这个,它生成了另一列(称为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等后面的所有数字分组。。因为它们代表对象。再次感谢

//编辑2 原始表,无筛选(存在0)


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


如果您遇到这些问题或需要更多帮助,请以可复制的方式分享一点您的数据-数据图片很难处理<例如,code>dput(df[1:20,])提供了数据帧前20行的可复制粘贴版本。

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


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

我不确定我是否理解您的问题,,如果没有可复制的示例,很难提供帮助

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

虚拟数据 里面有什么:
  • id:=rleid(y)
    :我们创建一个新变量
    id
    ,该变量具有变量y的游程长度id,即它的连续游程,非常接近您想要的值
  • startPos:=ifelse(id!=shift(id,1),1,0)
    :我们创建一个新变量
    startPos
    ,如果
    id
    与下一个变量不同,该变量将有一个1(从而标记此类id的起始位置)
  • 最后,我们过滤那些具有
    y==1
    (您感兴趣的数据)和
    startPos==1
    (起始位置)的结果
    dt
    仍保留所有原始数据

希望能有所帮助

我不确定我是否理解你的问题,如果没有可复制的例子,就很难提供帮助

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

虚拟数据 里面有什么:
  • id:=rleid(y)
    :我们创建一个新变量
    id
    ,该变量具有变量y的游程长度id,即它的连续游程,非常接近您想要的值
  • startPos:=ifelse(id!=shift(id,1),1,0)
    :我们创建一个新变量
    startPos
    ,如果
    id
    与下一个变量不同,该变量将有一个1(从而标记此类id的起始位置)
  • 最后,我们过滤那些具有
    y==1
    (您感兴趣的数据)和
    startPos==1
    (起始位置)的结果
    dt
    仍保留所有原始数据

希望它有帮助

如果您对
dplyr
没有问题,我们可以通过
lag
功能将其简化很多。这特别有用,因为我们可以为第一行设置默认值

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
库(dplry)
数据%>%
突变(T2=cumsum(像素位置-滞后(像素位置,默认值=0)>1))
#一个tibble:20x4
像素位置时间点强度T2
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

如果您对
dplyr
没问题,我们可以使用
lag
函数将其简化很多。这特别有用,因为我们可以为第一行设置默认值

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
库(dplry)
数据%>%
突变(T2=cumsum(像素位置-滞后(像素位置,默认值=0)>1))
#一个tibble:20x4
像素位置时间点强度T2
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(factor(df$first_column-1:nrow(df))

我使用


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

感谢您的快速回复,我在帖子中添加了一个编辑谢谢您的快速回复,我在帖子中添加了一个编辑。我不知道您所说的“将T2中1,2,3等后面的所有数字分组……因为它们代表对象。”我想
T2
正是您想要的。如果不是这样的话,你能告诉我你想要什么吗?对不起,我应该说得更清楚一些,所以现在我的数据已经用filter(变量,强度==1)过滤了,所以0个强度值都不存在。我希望有一种方法可以确保T2中分配给每个像素位置的变量即使在强度值为0返回到表中后仍然保持不变,以便于图形绘制。如果我尝试应用你建议的函数,当强度为0的像素出现时,我认为它不会起作用。所以我想知道是否有一种方法可以保存分配,然后稍后将其与完整的表合并。谢谢这真的很难
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, ]
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