【问题标题】:Create new variable based on numeric pattern in R根据 R 中的数字模式创建新变量
【发布时间】:2021-11-01 20:10:19
【问题描述】:

我正在尝试根据对另一个变量 (v1) 的数值响应模式创建一个新变量 (v2)。我正在使用的数据集是长格式并按访问排序。我曾尝试按“id”变量分组并在 dplyr 中使用“总结”的各种组合,但似乎无法弄清楚这一点。以下是我想要实现的示例。

    id     visit    v1     v2
   <dbl>   <int>  <dbl>  <int>
 1 10001     1      0      1
 2 10001     2      0      1
 3 10002     1      0      2
 4 10002     2      1      2
 5 10003     1      1      3
 6 10003     2      0      3

v2 的值 1 应反映对 id 10001 的两次访问的响应模式为 0,2 反映响应模式为 0/1,依此类推。

提前感谢您的帮助!

【问题讨论】:

  • 你有多少种模式? 0/0->1, 0/1->2, 1/0->3 你还有什么?

标签: r dplyr tidyverse


【解决方案1】:

另一种方式是:

dat %>%
    group_by(id) %>%
    mutate(v2 = c("00" = 1, "01" = 2, "10" = 3, "11" = 4)[paste(v1, collapse = "")])
# A tibble: 6 x 4
# Groups:   id [3]
     id visit    v1    v2
  <int> <int> <int> <dbl>
1 10001     1     0     1
2 10001     2     0     1
3 10002     1     0     2
4 10002     2     1     2
5 10003     1     1     3
6 10003     2     0     3

【讨论】:

    【解决方案2】:

    假设:

    • id 内,我们总是正好有 2 行

    基础 R

    ave(dat$v1, dat$id, FUN = function(z) {
      if (length(z) != 2) return(NA_integer_)
      switch(paste(z, collapse = ""),
        "00" = 1L, 
        "01" = 2L, 
        "10" = 3L, 
        "11" = 4L, 
        NA_integer_)
    })
    # [1] 1 1 2 2 3 3
    

    dplyr

    library(dplyr)
    dat %>%
      group_by(id) %>%
      mutate(v2 = if (n() != 2) NA_integer_ else case_when(
        all(v1 == c(0L, 0L)) ~ 1L, 
        all(v1 == c(0L, 1L)) ~ 2L, 
        all(v1 == c(1L, 0L)) ~ 3L, 
        all(v1 == c(1L, 1L)) ~ 4L, 
        TRUE ~ NA_integer_)
      ) %>%
      ungroup()
    # # A tibble: 6 x 4
    #      id visit    v1    v2
    #   <int> <int> <int> <int>
    # 1 10001     1     0     1
    # 2 10001     2     0     1
    # 3 10002     1     0     2
    # 4 10002     2     1     2
    # 5 10003     1     1     3
    # 6 10003     2     0     3
    

    数据

    dat <- structure(list(id = c(10001L, 10001L, 10002L, 10002L, 10003L, 10003L), visit = c(1L, 2L, 1L, 2L, 1L, 2L), v1 = c(0L, 0L, 0L, 1L, 1L, 0L), v2 = c(1L, 1L, 2L, 2L, 3L, 3L)), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-26
      • 2021-12-03
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多