根据ID多次基于列值条件对行进行聚类

时间:2018-10-23 13:12:46

标签: r dplyr mutate id

前段时间,我在此post

中打开了一个相关问题

假设我有以下df:

data <- data.frame(ID = c(1,1,1,1,1,1,1,1,1,1,1, 1, 1,1,1,1,1,1,1,1,1,1),
               Obs1 = c(1,1,0,1,0,1,1,0,1,0,0,0,1,1,1,1,1,1,1,1,0,1),
               Control = c(0,3,3,1,12,1,1,1,36,13,1,1,2,24,2,2,48,24,20,21,10,10),
               ClusterObs1 = c(1,1,1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,5,5,5,5,6))

我想获得:

data <- data.frame(ID = c(1,1,1,1,1,1,1,1,1,1,1, 1, 1,1,1,1,1,1,1,1,1,1),
               Obs1 = c(1,1,0,1,0,1,1,0,1,0,0,0,1,1,1,1,1,1,1,1,0,1),
               Control = c(0,3,3,1,12,1,1,1,36,13,1,1,2,24,2,2,48,24,20,21,10,10),
               ClusterObs1 = c(1,1,1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,5,5,5,5,6),
               DesiredResultClusterObs1 = c(1,1,1,2,2,3,3,3,4,4,4,4,5,6,6,6,7,8,9,10,10,11))

条件是: 如果“控件”的值大于12并且实际“ Obs1”值等于1并且与先前的“ Obs1”值相等,则“ DesiredResultClusterObs1”值应加+1(与其他question的主要区别是连续的控制值必须大于12)

关于如何实现预期结果的任何想法。

1 个答案:

答案 0 :(得分:1)

我不知道如何使用whith()和rle()函数,但是我已经使用ifelse解决了这个问题。

data <- data %>% mutate (aux = ifelse (Control>12 & Obs1 == 1 & lag(Obs1) ==1,1,0),
                         DesiredResultClusterObs1 = ClusterObs1 + cumsum(aux))

aux变量不是必需的,它仅有助于逐步了解。您也可以执行以下操作

data <- data %>% mutate (DesiredResultClusterObs1 =
                         ClusterObs1 + 
                         cumsum(ifelse (Control>12 & Obs1 == 1 & lag(Obs1) ==1,1,0)))