r语言 - cut() 和标签在 tibble 中使用相同的中断和标签



我得到了一个 8984 乘以 155 的 tibble,我需要以相同的方式cut()和标记所有列,即使用相同的切割和相同的标签来创建一个新的标记 tibble。如何以简单的方式执行此操作?

这里一个 3 乘以 3 tibble 来模拟我的 8984 次 155 tibble

# install.packages(c("tidyverse", "lubridate"), dependencies = TRUE)
require(tidyverse)
df <- tibble(x = 1:3, y = c(4, NA, 6))
df <- df %>% mutate(iD = row_number())
#> # A tibble: 3 x 3
#>       x     y    iD
#>   <int> <dbl> <int>
#> 1     1  4.00     1
#> 2     2 NA        2
#> 3     3  6.00     3

现在,我目前这样标记它,我意识到我可以创建一个breaks对象和一个labels对象并重用它们,但是没有办法重复mutate()调用吗?

df_labeled <-  df %>% mutate(x = cut(x, breaks = c(-Inf,1,3,6),
labels = c('Low', 'middle', 'high'), include.lowest = TRUE),
y = cut(y, breaks = c(-Inf,1,3,6),
labels = c('Low', 'middle', 'high'), include.lowest = TRUE)) %>% 
select(iD, x, y)

这给了我想要的东西,但我正在寻找一种更通用的方法。

df_labeled
#> # A tibble: 3 x 3
#>      iD x      y    
#>   <int> <fct>  <fct>
#> 1     1 Low    high 
#> 2     2 middle <NA> 
#> 3     3 middle high

附言当我调用我的 id 变量时,我是唯一一个收到错误的人id

受到爵士乐评论的启发,我目前正在尝试这个

df %>% mutate_at(vars(-iD),cut(as.numeric(.), breaks = c(-Inf,1,3,6), 
labels = c('Low', 'middle', 'high'), include.lowest = TRUE)) 

但我仍然收到错误,

Error in cut(as.numeric(.), breaks = c(-Inf, 1, 3, 6), labels = c("Low",  : 
(list) object cannot be coerced to type 'double'

我目前正在阅读手册以弄清楚这一点。

你很难应用jazzurro的评论是因为你不需要as.numeric(.)

df %>%
mutate_at(vars(-iD), cut, breaks = c(-Inf, 1, 3, 6), include.lowest = TRUE,
labels = c('Low', 'middle', 'high'))
# A tibble: 3 x 3
x      y    iD
<fctr> <fctr> <int>
1    Low   high     1
2 middle   <NA>     2
3 middle   high     3

最新更新