`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
此方法的问题是您排列值的顺序与数据集中的顺序不同,因此您需要在将新变量添加到数据集之前对数据进行排序。
我想我混淆了 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
此方法的问题是您排列值的顺序与数据集中的顺序不同,因此您需要在将新变量添加到数据集之前对数据进行排序。