基于r中多个条件的循环
Loop based on multiple conditions in r
我有这样的数据集,
x time
1 TRUE 10
2 FALSE 20
3 TRUE 11
4 FALSE 10
5 TRUE 16
6 FALSE 2
7 TRUE 17
8 FALSE 6
9 TRUE 11
10 FALSE 7
11 TRUE 20
12 FALSE 3
13 TRUE 10
14 FALSE 4
15 TRUE 2
16 FALSE 10
17 TRUE 3
18 FALSE 6
我想使用 r 生成一个新变量来标记基于 x 和时间的某些条件。具体来说,我想从头开始搜索数据,当“x 为真且 time 长于 15”时,我想找到“x 为 FALSE 且 time 长于 5” 的下一行,并将其标记在新变量中。在整个数据集中重复执行此操作。
我想要得到的输出是这样的。
x time Marker
1 TRUE 10
2 FALSE 20
3 TRUE 11
4 FALSE 10
5 TRUE 16
6 FALSE 2
7 TRUE 17
8 FALSE 6 Meet
9 TRUE 11
10 FALSE 7
11 TRUE 20
12 FALSE 3
13 TRUE 10
14 FALSE 4
15 TRUE 2
16 FALSE 10 Meet
17 TRUE 3
18 FALSE 6
我正在考虑在 r 中循环执行此操作,因为我有一个很长的数据集,但无法解决这个问题。如有任何建议,我们将不胜感激。
假设您的 data.frame 被称为 d
look <- FALSE
d$Marker <- NA
for(i in 1:nrow(d)){
if(d$x[i] & d$time[i] > 15){
look <- TRUE
next
}
if(look){
if(!d$x[i] & d$time[i] > 5){
d$Marker[i] <- "Meet"
look <- FALSE
}
}
}
library(dplyr)
mark_first <- function(x) {
out <- rep('', length(x))
if (!any(x)) return(out)
out[which.max(x)] <- "Meet"
return(out)
}
d %>%
group_by(g = cumsum(x & (time > 15))) %>%
mutate(Marker = mark_first(!x & time < 5))
# A tibble: 18 × 4
# Groups: g [4]
x time g Marker
<lgl> <int> <int> <chr>
1 TRUE 10 0 ""
2 FALSE 20 0 ""
3 TRUE 11 0 ""
4 FALSE 10 0 ""
5 TRUE 16 1 ""
6 FALSE 2 1 "Meet"
7 TRUE 17 2 ""
8 FALSE 6 2 ""
9 TRUE 11 2 ""
10 FALSE 7 2 ""
11 TRUE 20 3 ""
12 FALSE 3 3 "Meet"
13 TRUE 10 3 ""
14 FALSE 4 3 ""
15 TRUE 2 3 ""
16 FALSE 10 3 ""
17 TRUE 3 3 ""
18 FALSE 6 3 ""
我有这样的数据集,
x time
1 TRUE 10
2 FALSE 20
3 TRUE 11
4 FALSE 10
5 TRUE 16
6 FALSE 2
7 TRUE 17
8 FALSE 6
9 TRUE 11
10 FALSE 7
11 TRUE 20
12 FALSE 3
13 TRUE 10
14 FALSE 4
15 TRUE 2
16 FALSE 10
17 TRUE 3
18 FALSE 6
我想使用 r 生成一个新变量来标记基于 x 和时间的某些条件。具体来说,我想从头开始搜索数据,当“x 为真且 time 长于 15”时,我想找到“x 为 FALSE 且 time 长于 5” 的下一行,并将其标记在新变量中。在整个数据集中重复执行此操作。
我想要得到的输出是这样的。
x time Marker
1 TRUE 10
2 FALSE 20
3 TRUE 11
4 FALSE 10
5 TRUE 16
6 FALSE 2
7 TRUE 17
8 FALSE 6 Meet
9 TRUE 11
10 FALSE 7
11 TRUE 20
12 FALSE 3
13 TRUE 10
14 FALSE 4
15 TRUE 2
16 FALSE 10 Meet
17 TRUE 3
18 FALSE 6
我正在考虑在 r 中循环执行此操作,因为我有一个很长的数据集,但无法解决这个问题。如有任何建议,我们将不胜感激。
假设您的 data.frame 被称为 d
look <- FALSE
d$Marker <- NA
for(i in 1:nrow(d)){
if(d$x[i] & d$time[i] > 15){
look <- TRUE
next
}
if(look){
if(!d$x[i] & d$time[i] > 5){
d$Marker[i] <- "Meet"
look <- FALSE
}
}
}
library(dplyr)
mark_first <- function(x) {
out <- rep('', length(x))
if (!any(x)) return(out)
out[which.max(x)] <- "Meet"
return(out)
}
d %>%
group_by(g = cumsum(x & (time > 15))) %>%
mutate(Marker = mark_first(!x & time < 5))
# A tibble: 18 × 4 # Groups: g [4] x time g Marker <lgl> <int> <int> <chr> 1 TRUE 10 0 "" 2 FALSE 20 0 "" 3 TRUE 11 0 "" 4 FALSE 10 0 "" 5 TRUE 16 1 "" 6 FALSE 2 1 "Meet" 7 TRUE 17 2 "" 8 FALSE 6 2 "" 9 TRUE 11 2 "" 10 FALSE 7 2 "" 11 TRUE 20 3 "" 12 FALSE 3 3 "Meet" 13 TRUE 10 3 "" 14 FALSE 4 3 "" 15 TRUE 2 3 "" 16 FALSE 10 3 "" 17 TRUE 3 3 "" 18 FALSE 6 3 ""