`mapply` 的奇怪行为 [R]

Weird behavior with `mapply` [R]

我想我混淆了 mapply 用法,但我看不出是什么。我正在尝试根据每个组的特定截止值对多个组进行分类...

> dt <- source("https://pastebin.com/raw/pX0XVBSB")$value
> dt$aux <- mapply(x = unique(dt$group), y = c(rep(0.02, 2), rep(0.2, 4)), 
                 function(x,y){
                   ifelse(dt$var[dt$group == x] < x, 0, 1)
                   }) %>% unlist
> head(dt[is.na(dt$var),])
#     group var aux
# 52     g3  NA   0
# 66     g4  NA   0
# 287    g3  NA   0
# 336    g3  NA   0
# 337    g3  NA   0
# 363    g6  NA   0

...但是 NA 发生了一些事情,我预计 var = NA 也会是 NA(其余值已正确分类)。

请问您知道我做错了什么吗?

编辑

我期望正确的 var 分类:如果低于特定截止值则为 0,如果等于或更高则为 1。

#   group   var aux
# 1    g1 0.010   0 #below cutoff for g1, 0.02
# 2    g1 0.210   1 #above cutoff for g1, 0.02
# 3    g1 0.021   1
# 4    g1 0.021   1
# 5    g3 0.001   0 #below cutoff for g3, 0.2
# 6    g3 3.100   1 #above cutoff for g3, 0.2

这是您要找的吗?只设置两个条件语句会更容易:

library(tidyverse)

dt <- source("https://pastebin.com/raw/pX0XVBSB")$value |>
  as_tibble()


dt |>
  mutate(aux = case_when(
    group %in% c("g1", "g2") ~ ifelse(var < 0.02, 0, 1),
    T ~ ifelse(var < 0.2, 0, 1)
  ))
#> # A tibble: 512 x 3
#>    group    var   aux
#>    <chr>  <dbl> <dbl>
#>  1 g1    0.01       0
#>  2 g1    0.01       0
#>  3 g1    0          0
#>  4 g1    0          0
#>  5 g1    0.021      1
#>  6 g1    0.021      1
#>  7 g1    0.0008     0
#>  8 g1    0.0008     0
#>  9 g1    0.0014     0
#> 10 g1    0.0014     0
#> # ... with 502 more rows

编辑

这是一个基本的 R 方式

dt$aux <- ifelse(dt$group %in% c("g1", "g2"), 
                 ifelse(dt$var < 0.02, 0, 1),
                 ifelse(dt$var < 0.2, 0, 1))

head(dt)
#> # A tibble: 6 x 3
#>   group   var   aux
#>   <chr> <dbl> <dbl>
#> 1 g1    0.01      0
#> 2 g1    0.01      0
#> 3 g1    0         0
#> 4 g1    0         0
#> 5 g1    0.021     1
#> 6 g1    0.021     1

编辑 2

library(tidyverse)

vals <- map2(unique(dt$group), 
             c(rep(0.02, 2), rep(0.2, 4)),
             \(x,y) (ifelse(dt[dt$group == x,"var"] < y, 0, 1))) |>
  unlist()

dt|>
  arrange(group) |>
  mutate(aux = vals)
#> # A tibble: 512 x 3
#>    group    var   aux
#>    <chr>  <dbl> <dbl>
#>  1 g1    0.01       0
#>  2 g1    0.01       0
#>  3 g1    0          0
#>  4 g1    0          0
#>  5 g1    0.021      1
#>  6 g1    0.021      1
#>  7 g1    0.0008     0
#>  8 g1    0.0008     0
#>  9 g1    0.0014     0
#> 10 g1    0.0014     0
#> # ... with 502 more rows

此方法的问题是您排列值的顺序与数据集中的顺序不同,因此您需要在将新变量添加到数据集之前对数据进行排序。