我想我將某些東西與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
uj5u.com熱心網友回復:
這是你想要的?只設定兩個條件陳述句會更容易:
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
這種方法的問題是您排列值的順序與資料集中的順序不同,因此您需要在將新變數添加到資料集之前對資料進行重新排序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/444853.html
