r - 在使用 `cut()` 合并数据后创建一个 `chr` 列标签
问题描述
我曾经cut()
为我的一列数据创建容器。mtcars
使用下面的可复制示例:
library(tidyverse)
df <- mtcars
df$mpg_binned <- cut(x = df$mpg, breaks = 4)
df <- df %>% select(mpg, mpg_binned, everything())
head(df)
#> mpg mpg_binned cyl disp hp drat wt qsec vs am
#> Mazda RX4 21.0 (16.3,22.1] 6 160 110 3.90 2.620 16.46 0 1
#> Mazda RX4 Wag 21.0 (16.3,22.1] 6 160 110 3.90 2.875 17.02 0 1
#> Datsun 710 22.8 (22.1,28] 4 108 93 3.85 2.320 18.61 1 1
#> Hornet 4 Drive 21.4 (16.3,22.1] 6 258 110 3.08 3.215 19.44 1 0
#> Hornet Sportabout 18.7 (16.3,22.1] 8 360 175 3.15 3.440 17.02 0 0
#> Valiant 18.1 (16.3,22.1] 6 225 105 2.76 3.460 20.22 1 0
使用新列mpg_binned
(上图),我想创建一个新chr
列作为 bin 的标签(当我为最终用户创建输出表时)。
所以我想要的输出就像
#> mpg mpg_binned bin_label
#> Mazda RX4 21.0 (16.3,22.1] 16.3 < mpg <= 22.1
#> Mazda RX4 Wag 21.0 (16.3,22.1] 16.3 < mpg <= 22.1
#> Datsun 710 22.8 (22.1,28] 22.1 < mpg <= 28
#> Hornet 4 Drive 21.4 (16.3,22.1] 16.3 < mpg <= 22.1
如果只有两个箱子,我会使用ifelse()
--with multiple bins,我需要做一个嵌套的ifelse()
吗?有没有更简单的?
出于某种原因,对于一个垃圾箱,我无法让下面的行工作。我正在寻找标记所有垃圾箱。
Tidyverse 解决方案会很棒,但我对所有解决方案持开放态度。
df$bin_label <-
ifelse(df2$mpg_binned=="(16.3,22.1]", yes = "16.3 < mpg <= 22.1", no = df2$mpg_binned)
解决方案
由于我们事先不知道breaks
要划分的确切数据是什么,因此一种选择是使用正则表达式来提取数字。所以对于mpg
列,我们可以做
sub("\\((\\d+\\.?\\d?),(\\d+\\.?\\d?).*", "\\1 < mpg <= \\2", df$mpg_binned)
#[1] "16.3 < mpg <= 22.1" "16.3 < mpg <= 22.1" "22.1 < mpg <= 28"
# "16.3 < mpg <= 22.1" "16.3 < mpg <= 22.1" ......
这将避免编写多个ifelse
语句,因为它可以随着数量的breaks
增加而增长。
对于我们想要对提取的数字执行一些数学运算的更新案例,我们可能需要单独提取数字。
library(dplyr)
df %>%
mutate(first_part = sub("\\((\\d+\\.?\\d?).*", "\\1", mpg_binned),
second_part = as.numeric(sub(".*,(\\d+\\.?\\d?).*", "\\1", mpg_binned)) - 1) %>%
tidyr::unite(combined, first_part, second_part, sep = "< mpg <= ")
# mpg cyl disp hp drat wt qsec vs am gear carb mpg_binned combined
#1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 (16.3,22.1] 16.3< mpg <= 21.1
#2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 (16.3,22.1] 16.3< mpg <= 21.1
#3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 (22.1,28] 22.1< mpg <= 27
#4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 (16.3,22.1] 16.3< mpg <= 21.1
#5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 (16.3,22.1] 16.3< mpg <= 21.1
#...
推荐阅读
- swift - SDKApplicationDelegate 使用未解析的标识符
- cookies - 正确(技术上)处理 cookie 同意
- excel - 选择工作表命令在损坏的 Excel 文件中不起作用
- ios - 如何使用 com.whatsapp 或 com.facebook.Facebook 等捆绑标识符打开外部应用程序?
- java - 在枚举中调用超类型构造函数之前无法引用 Const.getText
- vb.net - 当用户没有在多行文本框的第二行输入文本时,如何添加错误消息?
- sql - 我不知道 SELECT for NAME, SURNAME, AGE, OS_NAME where age> = 15 之后会发生什么
- kernel - media-ctl IPU 绑定:无法设置链接
- momentjs - 如何使用时刻从两个日期范围获得星期五到星期五的星期
- c# - WindowStartupLocation CenterOwner is only working in Visual Studio