我希望在每次相等值运行中创建一个序列号,比如一个出现计数器,一旦当前行中的值与前一行不同,它就会重新启动.
请在下面找到输入和预期输出的示例.
dataset <- data.frame(input = c("a","b","b","a","a","c","a","a","a","a","b","c"))
dataset$counter <- c(1,1,2,1,2,1,1,2,3,4,1,1)
dataset
# input counter
# 1 a 1
# 2 b 1
# 3 b 2
# 4 a 1
# 5 a 2
# 6 c 1
# 7 a 1
# 8 a 2
# 9 a 3
# 10 a 4
# 11 b 1
# 12 c 1
Run Code Online (Sandbox Code Playgroud)
我的问题与这个问题非常相似:值的累积序列.
我有一个data.frame真的很大(实际上是一个data.table).现在,为简化起见,我们假设我的data.frame如下:
x <- c(1, 1, 0, 0, 1, 0, 0, NA, NA, 0)
y <- c(1 ,0 ,NA, NA, 0, 0, 0, 1, 1, 0)
mydf <- data.frame(rbind(x,y))
Run Code Online (Sandbox Code Playgroud)
我想确定哪一行(如果有的话)最后一个序列由三个连续的零形成,而不是考虑NA.因此,在上面的示例中,第一行在最后一个序列中有三个连续的零,但不是第二个.
如果我只有一个向量(不是data.frame),我知道如何做到这一点:
runs <- rle(x[is.na(x)==F])
runs$lengths[length(runs$lengths)] > 2 & runs$values[length(runs$lengths)]==0
Run Code Online (Sandbox Code Playgroud)
我显然可以做一个循环,我会得到我想要的东西.但它的效率非常低,我的实际数据框架非常大.那么,关于如何以最快的方式做的任何想法?
我猜申请可能很有用,但我现在无法考虑使用它.此外,也许有一种data.table方式这样做?
ps.:实际上,这个data.frame是我原始data.table的重新整形版本.如果以某种方式我可以使用原始格式的data.frame完成工作,那没关系.要了解我的data.frame原来是什么,只需将其视为:
x <- c(1, 1, 0, 0, 1, 0, 0, 0)
y <- c(1 ,0 , 0, 0, 0, 1, 1, 0)
myOriginalDf <- data.frame(value=c(x,y), id=rep(c('x','y'), c(length(x), length(y))))
Run Code Online (Sandbox Code Playgroud) 如果我有一个矢量
"a": 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0
Run Code Online (Sandbox Code Playgroud)
我想知道有多少1人在一起a,在这种情况下答案是3和2.
有没有可以做到这一点的脚本?