我想將 case_when 應用于資料框中的所有列。
set.seed(1)
data <- tibble(x = runif(10), y = x * 2)
data
對于 0.5 以上的所有列,我想用字串 ">0.5" 替換,對于 1 以上的列,我想用 ">1" 替換。
我試過 case_when,但似乎我必須指定像 x 和 y 這樣的列。我想在不指定列的情況下使用 case_when 并在整個資料框中使用它。
uj5u.com熱心網友回復:
一個purrr解決方案;
library(purrr)
data %>%
map_df(~case_when(.x > 0.5 & .x < 1 ~ ">0.5",
.x >= 1 ~ ">1"))
輸出;
x y
<chr> <chr>
1 NA >0.5
2 NA >0.5
3 >0.5 >1
4 >0.5 >1
5 NA NA
6 >0.5 >1
7 >0.5 >1
8 >0.5 >1
9 >0.5 >1
10 NA NA
uj5u.com熱心網友回復:
這是一個潛在的解決方案:
library(tidyverse)
set.seed(1)
data <- tibble(x = runif(10), y = x * 2)
data
#> # A tibble: 10 × 2
#> x y
#> <dbl> <dbl>
#> 1 0.266 0.531
#> 2 0.372 0.744
#> 3 0.573 1.15
#> 4 0.908 1.82
#> 5 0.202 0.403
#> 6 0.898 1.80
#> 7 0.945 1.89
#> 8 0.661 1.32
#> 9 0.629 1.26
#> 10 0.0618 0.124
data %>%
mutate(across(everything(),
~case_when(.x > 0.5 & .x < 1.0 ~ ">0.5",
.x >= 1.0 ~ ">1")))
#> # A tibble: 10 × 2
#> x y
#> <chr> <chr>
#> 1 <NA> >0.5
#> 2 <NA> >0.5
#> 3 >0.5 >1
#> 4 >0.5 >1
#> 5 <NA> <NA>
#> 6 >0.5 >1
#> 7 >0.5 >1
#> 8 >0.5 >1
#> 9 >0.5 >1
#> 10 <NA> <NA>
由reprex 包(v2.0.1)于 2021 年 10 月 24 日創建
uj5u.com熱心網友回復:
我們可以使用if_allwith everything()(選擇所有列)來創建邏輯向量
library(dplyr)
data %>%
mutate(new = case_when(if_all(everything(), `>`, 1) ~ ">1", if_all(everything(), `>`, 0.5) ~ ">0.5")
)
-輸出
# A tibble: 10 × 3
x y new
<dbl> <dbl> <chr>
1 0.266 0.531 <NA>
2 0.372 0.744 <NA>
3 0.573 1.15 >0.5
4 0.908 1.82 >0.5
5 0.202 0.403 <NA>
6 0.898 1.80 >0.5
7 0.945 1.89 >0.5
8 0.661 1.32 >0.5
9 0.629 1.26 >0.5
10 0.0618 0.124 <NA>
注意:作為在整個資料集上指定的 OP,這確實根據對整個資料集的評估創建了列
如果 OP 意味著單獨的列,請使用 between
data %>%
mutate(across(everything(),
~ case_when(between(.x, 0.5, 1) ~"> 0.5", TRUE ~ "> 1")))
# A tibble: 10 × 2
x y
<chr> <chr>
1 > 1 > 0.5
2 > 1 > 0.5
3 > 0.5 > 1
4 > 0.5 > 1
5 > 1 > 1
6 > 0.5 > 1
7 > 0.5 > 1
8 > 0.5 > 1
9 > 0.5 > 1
10 > 1 > 1
如果我們想分開做
out <- as.data.frame(data)
out[] <- case_when(data > 0.5 ~ "> 0.5", data > 1 ~ "> 1")
uj5u.com熱心網友回復:
你可以使用cut-
library(dplyr)
data %>%
mutate(across(.fns = ~cut(., c(0.5, 1, Inf), c(">0.5", ">1"))))
# x y
# <fct> <fct>
# 1 NA >0.5
# 2 NA >0.5
# 3 >0.5 >1
# 4 >0.5 >1
# 5 NA NA
# 6 >0.5 >1
# 7 >0.5 >1
# 8 >0.5 >1
# 9 >0.5 >1
#10 NA NA
在基數 R 中,帶有lapply-
data[] <- lapply(data, function(x) cut(x, c(0.5, 1, Inf), c(">0.5", ">1")))
uj5u.com熱心網友回復:
另一個基本的 R 解決方案:
ff = function(z){x = rep(NA, length(z)); x[z > .5] = ">.5"; x[z > 1] = ">1";z = x }
sapply(data, ff)
# x y
# [1,] NA ">.5"
# [2,] NA ">.5"
# [3,] ">.5" ">1"
# [4,] ">.5" ">1"
# [5,] NA NA
# [6,] ">.5" ">1"
# [7,] ">.5" ">1"
# [8,] ">.5" ">1"
# [9,] ">.5" ">1"
#[10,] NA NA
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/334574.html
下一篇:因式分解導致NA
