【问题标题】:generate id conditionally r有条件地生成 id
【发布时间】:2018-02-20 21:31:35
【问题描述】:

我的数据是这样的

   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分隔中区域,中区域嵌套在大区域中。我想创建一个新的 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

谢谢!!

【问题讨论】:

  • 您能否阐明生成xintercept1 的启发式方法? “嵌套在其中”是什么意思?
  • 一个大区域有两个或多个中间区域,所以FL-L-2有FL-M-4和FL-M-5; FL-L-5 有 FL-M-14 和 FL-M-13。
  • 好的,我知道发生了什么。你能解释一下用NA这样的行分隔观察组的用例吗?这是用来作图的吗?
  • 是的,我想在ggplot中的每个大中区域之间绘制水平线

标签: r data-management


【解决方案1】:

我们可以使用 包中的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)

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 2020-06-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多