Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.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 - Fatal编程技术网

在R中查找值的下一个实例的行

在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", ""),

我有两个专栏时间和事件。有两个事件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", ""),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包,这样人们就可以使用一个公式了。