每个实体的连续值和关联位置-R
我有一个数据表,如下所示: 我需要查找的内容(对于每个名称) a。列“值1”中连续数据为0时的行:显示在红色中 b。识别后,从下一行获取“Value2”的值:以绿色显示 我相信我可以使用包每个实体的连续值和关联位置-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
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