如何首先使用 case_when over unique value 创建一个新变量

how to use case_when over unique value first to create a new variable

我有一个数据框(x)。如您所见,我对同一个 ID 有不同的值(bp:yes/no 和 N),但有时,我有一个唯一的 ID,始终为 bp ==no.

x
      ID        bp    N
      8012199   no    75
      8012199   yes   2
      8012211   no    118
      8012211   yes   2
      8012321   no    37
      8012341   no    146
      8012342   no    84
  

我想创建一个新变量(frequency: low and high)

x
          ID        bp    N    frequency
          8012199   no    75   
          8012199   yes   2    low
          8012211   no    118  
          8012211   yes   4    high    
          8012321   no    37   low
          8012341   no    146  low 
          8012342   no    84   low

根据不同的条件:

  1. 如果 bp == 是 | n < 2:低
  2. 如果 bp == 是 | n > 2 :高
  3. 如果 ID 是唯一的(总是 = 否):低

到目前为止我试过的是

r <-  x %>% 
      mutate(bp= case_when(
      duplicated(ID)==FALSE  ~ "low",
      bp %in% "yes" & n <=2 ~ "low",
      bp %in% "yes" & n > 2 ~ "high" ))

duplicated(x$ID)
FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE 

它对“是”条件有效,但对重复无效。任何建议都会很棒!

您的两个示例略有不同 - 第 4 行中的 N 已更改。

我使用了第二个示例数据:

x <- tibble::tribble(
        ~ID,        ~bp,    ~N,
      "8012199",   "no",    75,
      "8012199",   "yes",   2,
      "8012211",   "no",    118,
      "8012211",   "yes",   4,
      "8012321",   "no",    37,
      "8012341",   "no",    146,
      "8012342",   "no",    84
)

这是一个使用 tidyverse 的解决方案:

library(tidyverse)
x %>% 
  group_by(ID) %>% 
  mutate(
    id_count = n(),
    frequency = case_when(
    bp == "yes" & N <=2 ~ "low",
    bp == "yes" & N > 2 ~ "high",
    bp == "no" & id_count == 1 ~ "low",
    TRUE ~ "")
  ) %>% 
  ungroup() %>% 
  select(-id_count)

基本上,id_count 变量计算每个 ID 号的行数。然后用于生成 low 频率结果。

另外,请注意我使用 N <= 2 来表示“低”频率。我是根据您提供的示例得出的。