在R中查找值的下一个实例的行
我有两个专栏时间和事件。有两个事件A和B。一旦一个事件A发生,我想知道下一个事件B何时发生。列时间\事件B是所需的输出 这是数据帧:在R中查找值的下一个实例的行,r,R,我有两个专栏时间和事件。有两个事件A和B。一旦一个事件A发生,我想知道下一个事件B何时发生。列时间\事件B是所需的输出 这是数据帧: df <- data.frame(Event = sample(c("A", "B", ""), 20, replace = TRUE), Time = paste("t", seq(1,20))) df这里有一个简单的解决方案: set.seed(1) df <- data.frame(Event = sample(c("A", "B", ""),
df <- data.frame(Event = sample(c("A", "B", ""), 20, replace = TRUE), Time = paste("t", seq(1,20)))
df这里有一个简单的解决方案:
set.seed(1)
df <- data.frame(Event = sample(c("A", "B", ""),size=20, replace=T), time = 1:20)
as <- which(df$Event == "A")
bs <- which(df$Event == "B")
next_b <- sapply(as, function(a) {
diff <- bs-a
if(all(diff < 0)) return(NA)
bs[min(diff[diff > 0]) == diff]
})
df$next_b <- NA
df$next_b[as] <- df$time[next_b]
> df
Event time next_b
1 A 1 2
2 B 2 NA
3 B 3 NA
4 4 NA
5 A 5 8
6 6 NA
7 7 NA
8 B 8 NA
9 B 9 NA
10 A 10 14
11 A 11 14
12 A 12 14
13 13 NA
14 B 14 NA
15 15 NA
16 B 16 NA
17 17 NA
18 18 NA
19 B 19 NA
20 20 NA
set.seed(1)
df这里有一个简单的解决方案:
set.seed(1)
df <- data.frame(Event = sample(c("A", "B", ""),size=20, replace=T), time = 1:20)
as <- which(df$Event == "A")
bs <- which(df$Event == "B")
next_b <- sapply(as, function(a) {
diff <- bs-a
if(all(diff < 0)) return(NA)
bs[min(diff[diff > 0]) == diff]
})
df$next_b <- NA
df$next_b[as] <- df$time[next_b]
> df
Event time next_b
1 A 1 2
2 B 2 NA
3 B 3 NA
4 4 NA
5 A 5 8
6 6 NA
7 7 NA
8 B 8 NA
9 B 9 NA
10 A 10 14
11 A 11 14
12 A 12 14
13 13 NA
14 B 14 NA
15 15 NA
16 B 16 NA
17 17 NA
18 18 NA
19 B 19 NA
20 20 NA
set.seed(1)
df这里尝试使用数据中的“滚动联接”。表包:
library(data.table)
setDT(df)
df[Event=="B", .(time, nextb=time)][df, on="time", roll=-Inf][Event != "A", nextb := NA][]
# time nextb Event
# 1: 1 2 A
# 2: 2 NA B
# 3: 3 NA B
# 4: 4 NA
# 5: 5 8 A
# 6: 6 NA
# 7: 7 NA
# 8: 8 NA B
# 9: 9 NA B
#10: 10 14 A
#11: 11 14 A
#12: 12 14 A
#13: 13 NA
#14: 14 NA B
#15: 15 NA
#16: 16 NA B
#17: 17 NA
#18: 18 NA
#19: 19 NA B
#20: 20 NA
使用从@thc借用的数据这里尝试使用数据中的“滚动联接”。表包:
library(data.table)
setDT(df)
df[Event=="B", .(time, nextb=time)][df, on="time", roll=-Inf][Event != "A", nextb := NA][]
# time nextb Event
# 1: 1 2 A
# 2: 2 NA B
# 3: 3 NA B
# 4: 4 NA
# 5: 5 8 A
# 6: 6 NA
# 7: 7 NA
# 8: 8 NA B
# 9: 9 NA B
#10: 10 14 A
#11: 11 14 A
#12: 12 14 A
#13: 13 NA
#14: 14 NA B
#15: 15 NA
#16: 16 NA B
#17: 17 NA
#18: 18 NA
#19: 19 NA B
#20: 20 NA
使用从@thc借用的数据如果您的R数据框被称为df
,那么您可以删除df$Time\u EventB
中的空格,并使用以下代码写入名为newdf
的新数据框:newdf数据截图没有帮助。将其至少以分隔文本格式放置,或者理想情况下在R中使用dput
。此外,是否存在B
不总是紧跟a
的情况?如果您的事件总是如图所示交替a到B,那么您的_数据$Time事件B[您的_数据$Event==“a”]=您的_数据$Time[您的_数据$Event==“B”]
应该可以工作。@Gregor我希望在您的\u data$Time\u EventB
中输出。因此它应该是这样的形式your_data$Time\u EventB如果您首先将列初始化为空白,your_data$Time\u EventB=“”
,我的代码应该可以正常工作。如果你愿意,我很乐意演示。开放地接受非您所期望的形式的答案。如果您的R数据框被称为df
,那么您可以删除df$Time\u EventB
中的空格,并使用此代码写入名为newdf
的新数据框:newdf数据截图没有帮助。将其至少以分隔文本格式放置,或者理想情况下在R中使用dput
。此外,是否存在B
不总是紧跟a
的情况?如果您的事件总是如图所示交替a到B,那么您的_数据$Time事件B[您的_数据$Event==“a”]=您的_数据$Time[您的_数据$Event==“B”]
应该可以工作。@Gregor我希望在您的\u data$Time\u EventB
中输出。因此它应该是这样的形式your_data$Time\u EventB如果您首先将列初始化为空白,your_data$Time\u EventB=“”
,我的代码应该可以正常工作。如果你愿意,我很乐意演示。开放地接受不是你期望的答案。谢谢。它看起来像一个解构的VLOOKUP。你应该把它做成一个VLOOKUP的R包,这样人们就可以使用一个单一的配方。谢谢。它看起来像一个解构的VLOOKUP。你应该把它做成一个VLOOKUP的R包,这样人们就可以使用一个公式了。