代码之家  ›  专栏  ›  技术社区  ›  user23942556

使用整洁选择创建一个带有mutate的新摘要变量

r
  •  2
  • user23942556  · 技术社区  · 3 月前

    我正试图在我的数据中创建一个摘要列,以“未来证明”另一个变量被添加到数据集中的情况。为此,我尝试使用整洁的选择语言,但未能做到这一点。一个最小的例子是:

    variables = c("v1", "v2")
    tst = tribble(
      ~ID, ~time, ~v1, ~v2,
      "1a", 1,  T,  F,
      "1b", 1,  F,  T,
      "1c", 1,  F,  F,
      "1a", 2,  T,  F,
      "1b", 2,  T,  T,
      "1c", 2,  F,  F
    )
    
    tst %>%
      group_by(ID, time) %>%
      mutate(any_v = any(v1,v2)) # works
    
    tst %>%
      group_by(ID, time) %>%
      mutate(any_v = any(all_of(variables))) # this doesnt work!
    

    我试图实现的是一个例子,其中变量“v3”可以添加到tribble和变量向量中,而mutate调用可以保持原样。任何帮助都将不胜感激!

    我已经尝试了大部分整洁的精选语言,但我不是这里的专家

    1 回复  |  直到 3 月前
        1
  •  1
  •   MrFlick    3 月前

    使用 pick() 拉出那些柱子

    tst %>%
      group_by(ID, time) %>%
      mutate(any_v = any(pick(all_of(variables)))) 
    #   ID     time v1    v2    any_v
    #   <chr> <dbl> <lgl> <lgl> <lgl>
    # 1 1a        1 TRUE  FALSE TRUE 
    # 2 1b        1 FALSE TRUE  TRUE 
    # 3 1c        1 FALSE FALSE FALSE
    # 4 1a        2 TRUE  FALSE TRUE 
    # 5 1b        2 TRUE  TRUE  TRUE 
    # 6 1c        2 FALSE FALSE FALSE
    

    如果你加上,你会得到相同的答案 v3 所有TRUE值

    tst %>%
      mutate(v3=TRUE) %>% 
      group_by(ID, time) %>%
      mutate(any_v = any(pick(all_of(variables))))
    #   ID     time v1    v2    v3    any_v
    #   <chr> <dbl> <lgl> <lgl> <lgl> <lgl>
    # 1 1a        1 TRUE  FALSE TRUE  TRUE 
    # 2 1b        1 FALSE TRUE  TRUE  TRUE 
    # 3 1c        1 FALSE FALSE TRUE  FALSE
    # 4 1a        2 TRUE  FALSE TRUE  TRUE 
    # 5 1b        2 TRUE  TRUE  TRUE  TRUE 
    # 6 1c        2 FALSE FALSE TRUE  FALSE
    

    或者,如果您一直想使用任何以“v”开头的列,请使用

    tst %>%
      mutate(v3=TRUE) %>% 
      group_by(ID, time) %>%
      mutate(any_v = any(pick(starts_with("v"))))
    #   ID     time v1    v2    v3    any_v
    #   <chr> <dbl> <lgl> <lgl> <lgl> <lgl>
    # 1 1a        1 TRUE  FALSE TRUE  TRUE 
    # 2 1b        1 FALSE TRUE  TRUE  TRUE 
    # 3 1c        1 FALSE FALSE TRUE  TRUE 
    # 4 1a        2 TRUE  FALSE TRUE  TRUE 
    # 5 1b        2 TRUE  TRUE  TRUE  TRUE 
    # 6 1c        2 FALSE FALSE TRUE  TRUE