有条件地生成id r

generate id conditionally r

我的数据是这样的

   large_region medium_region    id   id2 xinterceptm
 1 NA           NA             NA       1          1
 2 FL-L-2       FL-M-4         1.00     2          NA
 3 FL-L-2       FL-M-4         2.00     3          NA
 4 NA           NA             NA       4          4
 5 FL-L-2       FL-M-5         3.00     5          NA
 6 FL-L-2       FL-M-5         4.00     6          NA
 7 NA           NA             NA       7          7
 8 FL-L-5       FL-M-14        5.00     8          NA
 9 FL-L-5       FL-M-14        6.00     9          NA
10 NA           NA             NA      10          10
11 FL-L-5       FL-M-13        7.00    11          NA
12 FL-L-5       FL-M-13        8.00    12          NA
13 NA           NA             NA      13          13

xinterceptm分隔medium region,medium region嵌套在large region中。我想创建一个新的 id 来分隔大区域。我怎样才能像这样创建 xinterceptl

   large_region medium_region  id     id2 xinterceptm  xinterceptl
 1 NA           NA             NA       1           1     1
 2 FL-L-2       FL-M-4         1.00     2          NA     NA
 3 FL-L-2       FL-M-4         2.00     3          NA     NA
 4 NA           NA             NA       4           4     NA
 5 FL-L-2       FL-M-5         3.00     5          NA     NA
 6 FL-L-2       FL-M-5         4.00     6          NA     NA
 7 NA           NA             NA       7           7     7
 8 FL-L-5       FL-M-14        5.00     8          NA     NA
 9 FL-L-5       FL-M-14        6.00     9          NA     NA
10 NA           NA             NA      10          10     NA
11 FL-L-5       FL-M-13        7.00    11          NA     NA
12 FL-L-5       FL-M-13        8.00    12          NA     NA
13 NA           NA             NA      13          13     13

谢谢!!

我们可以使用 包中的 case_when 来评估 large_region 中的条件。

library(dplyr)

dat2 <- dat %>%
  mutate(xinterceptl = case_when(
    !is.na(large_region)                                                ~NA_integer_,
    is.na(large_region) & (lead(large_region) == lag(large_region))     ~NA_integer_,
    TRUE                                                                ~id2
  ))
dat2
#    large_region medium_region id id2 xinterceptm xinterceptl
# 1          <NA>          <NA> NA   1           1           1
# 2        FL-L-2        FL-M-4  1   2          NA          NA
# 3        FL-L-2        FL-M-4  2   3          NA          NA
# 4          <NA>          <NA> NA   4           4          NA
# 5        FL-L-2        FL-M-5  3   5          NA          NA
# 6        FL-L-2        FL-M-5  4   6          NA          NA
# 7          <NA>          <NA> NA   7           7           7
# 8        FL-L-5       FL-M-14  5   8          NA          NA
# 9        FL-L-5       FL-M-14  6   9          NA          NA
# 10         <NA>          <NA> NA  10          10          NA
# 11       FL-L-5       FL-M-13  7  11          NA          NA
# 12       FL-L-5       FL-M-13  8  12          NA          NA
# 13         <NA>          <NA> NA  13          13          13

数据

dat <- read.table(text = "   large_region medium_region    id   id2 xinterceptm
 1 NA           NA             NA       1          1
                  2 FL-L-2       FL-M-4         1.00     2          NA
                  3 FL-L-2       FL-M-4         2.00     3          NA
                  4 NA           NA             NA       4          4
                  5 FL-L-2       FL-M-5         3.00     5          NA
                  6 FL-L-2       FL-M-5         4.00     6          NA
                  7 NA           NA             NA       7          7
                  8 FL-L-5       FL-M-14        5.00     8          NA
                  9 FL-L-5       FL-M-14        6.00     9          NA
                  10 NA           NA             NA      10          10
                  11 FL-L-5       FL-M-13        7.00    11          NA
                  12 FL-L-5       FL-M-13        8.00    12          NA
                  13 NA           NA             NA      13          13",
                  header = TRUE, stringsAsFactors = FALSE)
dat%>%fill(large_region,.direction="up")%>%
     mutate(a=large_region!=lag(large_region),a=id2*(is.na(a)|a),a=`is.na<-`(a,a==0))
   large_region medium_region id id2 xinterceptm  a
1        FL-L-2          <NA> NA   1           1  1
2        FL-L-2        FL-M-4  1   2          NA NA
3        FL-L-2        FL-M-4  2   3          NA NA
4        FL-L-2          <NA> NA   4           4 NA
5        FL-L-2        FL-M-5  3   5          NA NA
6        FL-L-2        FL-M-5  4   6          NA NA
7        FL-L-5          <NA> NA   7           7  7
8        FL-L-5       FL-M-14  5   8          NA NA
9        FL-L-5       FL-M-14  6   9          NA NA
10       FL-L-5          <NA> NA  10          10 NA
11       FL-L-5       FL-M-13  7  11          NA NA
12       FL-L-5       FL-M-13  8  12          NA NA
13         <NA>          <NA> NA  13          13 13