我有以下内容:
df <- data.frame(ID = c(1,1,1,1,1,1,1,1,1,1,2,2,2),
Obs = c(0,1, 1, 0, 1,0,0, 1, 1, 1, 0,0,1))
我想要这个:
df <- data.frame(ID = c(1,1,1,1,1,1,1,1,1,1,2,2,2),
Obs = c(0,1, 1, 0, 1,0,0, 1, 1, 1, 0,0,1),
Cluster = c(0,1,1,1,2,2,2,3,3,3,0,0,1))
我怎样才能获得'Cluster'列,其中我必须按顺序排列数字1,直到出现第一个0,dplyr?
连续0必须保持该值,直到出现新值 .
EDIT
我怎么能用很多列做到这一点?
假设我有99个obs列,我想创建99个簇,每列一个 . 像这样:
df <- data.frame(ID = c(1,1,1,1,1,1,1,1,1,1,2,2,2),
Obs1 = c(0,1, 1, 0, 1,0,0, 1, 1, 1, 0,0,1),
Obs2 = c(0,0, 0, 1, 1,1,0, 1, 0, 1, 0,0,1),
ClusterObs1 = c(0,1,1,1,2,2,2,3,3,3,0,0,1),
ClusterObs2 = c(0,0,0,1,1,1,1,2,2,3,0,0,1))
2 回答
这是使用
rle
的选项:这是它的主要部分:
这告诉你每一段1或0在Obs列中有多长(我现在忽略ID分组) .
我们现在需要的是累计计算1s的strectches的次数,并且为了做到这一点,我们只是简单地计算出值为1的位置:
到目前为止一直很好,现在我们需要重复那些值,因为这些值很长,因此我们使用
rep
和来自rle的lengths
信息:最后,我们通过ID组进行此操作 .
如果需要为不同的obs-columns创建多个cluster-column,可以按如下方式轻松完成:
其中df是:
这是一个非常有趣的问题所以这里有一个data.table解决方案: