Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每个实体的连续值和关联位置-R_R_Data.table - Fatal编程技术网

每个实体的连续值和关联位置-R

每个实体的连续值和关联位置-R,r,data.table,R,Data.table,我有一个数据表,如下所示: 我需要查找的内容(对于每个名称) a。列“值1”中连续数据为0时的行:显示在红色中 b。识别后,从下一行获取“Value2”的值:以绿色显示 我相信我可以使用包rle(),但我很难获得每个“名称”的数据 我认为您不需要通过按名称进行分组,但我也不知道您的预期输出 这里有一个带有rle的选项(希望它能有所帮助) 给 > df[with(rle(df$Value1==0),cumsum(lengths)[which(values)])+1,] Name

我有一个数据表,如下所示:

我需要查找的内容(对于每个名称

a。列“值1”中连续数据为0时的行:显示在红色中

b。识别后,从下一行获取“Value2”的值:以绿色显示

我相信我可以使用包
rle()
,但我很难获得每个“名称”的数据


我认为您不需要通过按
名称进行分组,但我也不知道您的预期输出

这里有一个带有
rle
的选项(希望它能有所帮助)

> df[with(rle(df$Value1==0),cumsum(lengths)[which(values)])+1,]
   Name       Date Value1 Value2
5     A 2000-01-05     10     25
10    A 2000-01-10     50     50
15    B 2000-01-03      1     15
22    B 2000-01-10     50     50

其中
Value2
中的值是连续零后的值(绿色),您将通过读取行号看到位置

使用
数据的选项。表

DF[, c("rn", "zeroIdx") := .(.I, rowid(rleid(Value1)))]

#using zeroIdx to exclude single zeros
DF[DF[Value1==0 & zeroIdx > 1L,  
    rn[.N] + 1L, 
    cumsum(c(0L, diff(rn) > 1L))]$V1]
输出:

   Name       Date Value1 Value2 rn zeroIdx
1:    A 2000-01-05     10     25  5       1
2:    A 2000-01-10     50     50 10       1
3:    B 2000-01-03      1     15 15       1
4:    B 2000-01-10     50     50 22       1
名称为单零的数据:

DF <- structure(list(Name = c("A", "A", "A", "A", "A", "A", "A", "A", 
    "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", 
    "B", "B", "B"), Date = structure(c(10957, 10958, 10959, 10960, 
        10961, 10962, 10963, 10964, 10965, 10966, 10967, 10968, 10957, 
        10958, 10959, 10960, 10961, 10962, 10963, 10964, 10965, 10966, 
        10967, 10968), class = "Date"), Value1 = c(1, 2, 0, 0, 10, 20, 
            0, 0, 0, 50, 10, 20, 0, 0, 1, 2, 10, 20, 0, 0, 0, 50, 10, 20), 
    Value2 = c(5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 
        5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60)), row.names = c(NA, 
            -24L), class = c("data.table", "data.frame"), class = c("data.frame"))
setDT(DF)
DF <- rbindlist(list(DF, 
    data.table(Name="C", Date=Sys.Date() + 0L:3L, Value1=c(1,0,1,1), Value2=999)))
tail(DF)

#   Name       Date Value1 Value2 rn zeroIdx
#1:    B 2000-01-11     10     55 23       1
#2:    B 2000-01-12     20     60 24       1
#3:    C 2020-05-12      1    999 25       1
#4:    C 2020-05-13      0    999 26       1
#5:    C 2020-05-14      1    999 27       1
#6:    C 2020-05-15      1    999 28       2

DF请与
dput(DF)
共享您的数据,而不是要求我们从图像中转录可用数据(不太可能发生)。一般来说,请不要发布代码/数据/错误的图像:它无法复制或搜索(SEO),它会破坏屏幕阅读器,并且可能不适合某些移动设备。参考:(和)。请直接包括代码、控制台输出或数据(例如,
dput(head(x))
data.frame(…)
),谢谢您的注释和编辑。从现在起,我将继续。你们所有的例子都显示了两个或更多连续的零。一个零触发相同的逻辑吗?我一直在试图弄清楚这一点,但我对
data.table
不太熟悉。下面是一些代码,它将用一个
1
标记连续的
0
值:
setDT(df)[,零计数器:=as.integer(.N>1)*(Value1==0)),rleid(Value1==0)]
如果
Name
很重要,它可以通过以下方式转换为by-
Name
df[,.SD[with(rle(.SD$Value1==0)],cumsum(长度)[其中(值)]+1,],by=(Name)
@r2evans是的,如果
Name
很重要,那么就是这样。谢谢你的反馈@托马斯克丁。如何过滤出带有“2个或更多零”的数据?我确实有一些单零的情况。你能解释一下这个表达式是什么意思吗?DF[,c(“rn”,“zeroIdx”):=.(.I,rowid(rleid(Value1)))。。这里的“.I”是什么?
DF[, c("rn", "zeroIdx") := .(.I, rowid(rleid(Value1)))]

#using zeroIdx to exclude single zeros
DF[DF[Value1==0 & zeroIdx > 1L,  
    rn[.N] + 1L, 
    cumsum(c(0L, diff(rn) > 1L))]$V1]
   Name       Date Value1 Value2 rn zeroIdx
1:    A 2000-01-05     10     25  5       1
2:    A 2000-01-10     50     50 10       1
3:    B 2000-01-03      1     15 15       1
4:    B 2000-01-10     50     50 22       1
DF <- structure(list(Name = c("A", "A", "A", "A", "A", "A", "A", "A", 
    "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", 
    "B", "B", "B"), Date = structure(c(10957, 10958, 10959, 10960, 
        10961, 10962, 10963, 10964, 10965, 10966, 10967, 10968, 10957, 
        10958, 10959, 10960, 10961, 10962, 10963, 10964, 10965, 10966, 
        10967, 10968), class = "Date"), Value1 = c(1, 2, 0, 0, 10, 20, 
            0, 0, 0, 50, 10, 20, 0, 0, 1, 2, 10, 20, 0, 0, 0, 50, 10, 20), 
    Value2 = c(5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 
        5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60)), row.names = c(NA, 
            -24L), class = c("data.table", "data.frame"), class = c("data.frame"))
setDT(DF)
DF <- rbindlist(list(DF, 
    data.table(Name="C", Date=Sys.Date() + 0L:3L, Value1=c(1,0,1,1), Value2=999)))
tail(DF)

#   Name       Date Value1 Value2 rn zeroIdx
#1:    B 2000-01-11     10     55 23       1
#2:    B 2000-01-12     20     60 24       1
#3:    C 2020-05-12      1    999 25       1
#4:    C 2020-05-13      0    999 26       1
#5:    C 2020-05-14      1    999 27       1
#6:    C 2020-05-15      1    999 28       2