序列N+之后的分组数据;1英寸R
所以我有一个数据集,它有三列:位置、时间和强度。强度充满了二进制值,我已经过滤到只包含1(因为这表示感兴趣的对象,而0是背景) 我需要一种能够将数据分组为N+1之后的序列的方法;请参阅下图 如您所见,第一列从4变为22,以1为增量,然后再跳到39。在我的数据集中,有许多这样的情况(每个跳过代表一个对象的结束和另一个对象的开始)有没有一种方法可以找到N+1序列后面的数字的位置,然后将其分组成一个变量,这样我就可以识别每个对象的位置 编辑// 在回答之后,我使用了代码,它生成了这个,它生成了另一列(称为T2),其中包含数字:序列N+之后的分组数据;1英寸R,r,R,所以我有一个数据集,它有三列:位置、时间和强度。强度充满了二进制值,我已经过滤到只包含1(因为这表示感兴趣的对象,而0是背景) 我需要一种能够将数据分组为N+1之后的序列的方法;请参阅下图 如您所见,第一列从4变为22,以1为增量,然后再跳到39。在我的数据集中,有许多这样的情况(每个跳过代表一个对象的结束和另一个对象的开始)有没有一种方法可以找到N+1序列后面的数字的位置,然后将其分组成一个变量,这样我就可以识别每个对象的位置 编辑// 在回答之后,我使用了代码,它生成了这个,它生成了另一列
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)
,该变量具有变量y的游程长度id,即它的连续游程,非常接近您想要的值id
:我们创建一个新变量startPos:=ifelse(id!=shift(id,1),1,0)
,如果startPos
与下一个变量不同,该变量将有一个1(从而标记此类id的起始位置)id
- 最后,我们过滤那些具有
(您感兴趣的数据)和y==1
(起始位置)的结果startPos==1
仍保留所有原始数据dt
希望能有所帮助我不确定我是否理解你的问题,如果没有可复制的例子,就很难提供帮助 无论如何,我将提供data.table解决方案: 虚拟数据 里面有什么:
:我们创建一个新变量id:=rleid(y)
,该变量具有变量y的游程长度id,即它的连续游程,非常接近您想要的值id
:我们创建一个新变量startPos:=ifelse(id!=shift(id,1),1,0)
,如果startPos
与下一个变量不同,该变量将有一个1(从而标记此类id的起始位置)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