[英]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.