计算列中的连续重复项

时间:2017-04-20 15:21:18

标签: r vector dataframe duplicates

我想知道一个数字连续出现在一列中的行数,并将此数字放入每个匹配项的矩阵中。

例如,我想使用此输入来查找所有连续的-1次出现

df$V1

0
1
0
-1
-1
0
1
-1
-1
-1
1

找到连续-1的行数:

output
2
3

我所能想到的只是遍历每一行,看看上面一行中是否发生-1并且当前行中的-1也是... // Get data of element and split it into an array var ar = $('#dom-target').data('stuff').split(','); // Use this array to get a Date var parsedDate = new Date(Date.UTC.apply(null, ar)); // Do your logic jQuery('#myCounter').mbComingsoon({expiryDate: parsedDate , speed: 500}); ... ,然后添加到计数器中。但我想有必要有更快的方法来做到这一点?

3 个答案:

答案 0 :(得分:2)

使用rle

x = c(0L, 1L, 0L, -1L, -1L, 0L, 1L, -1L, -1L, -1L, 1L)    
with(rle(x), lengths[values == -1])
#[1] 2 3

适用于unique

的所有x元素
with(rle(x), setNames(sapply(unique(values), function(x)
                lengths[values == x]), nm = unique(values)))
#$`0`
#[1] 1 1 1

#$`1`
#[1] 1 1 1

#$`-1`
#[1] 2 3

答案 1 :(得分:0)

对于所有值,我们都可以使用rleid

中的data.table执行此操作
library(data.table)
res <- setDT(df)[, .(value = V1[1L], n = .N), .(grp = rleid(V1))]
res
#   grp value n
#1:   1     0 1
#2:   2     1 1
#3:   3     0 1
#4:   4    -1 2
#5:   5     0 1
#6:   6     1 1
#7:   7    -1 3
#8:   8     1 1

由此,我们可以将元素分配到&#39; V1&#39;是-1

res[value== -1][, grp := NULL][]
#   value n
#1:    -1 2
#2:    -1 3

数据

df <- structure(list(V1 = c(0L, 1L, 0L, -1L, -1L, 0L, 1L, -1L, -1L, 
-1L, 1L)), .Names = "V1", row.names = c(NA, -11L), class = "data.frame")

答案 2 :(得分:0)

你可以在基础R:

中做到这一点
r <- x==-1
diff(unique(cumsum(r)[!r]))
#[1] 2 3

x <- df$V1