首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用“`cut()”绑定数据后,创建标签的“`cut”列

使用“`cut()”绑定数据后,创建标签的“`cut”列
EN

Stack Overflow用户
提问于 2019-08-26 02:11:16
回答 2查看 42关注 0票数 0

我使用cut()为我的数据列创建了回收箱。下面使用mtcars的可复制示例:

代码语言:javascript
复制
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列,它充当回收箱的标签(当我为最终用户创建输出表时)。

所以我想要的输出应该是

代码语言:javascript
复制
#>                    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()--对于多个回收箱,我需要做一个嵌套的ifelse()吗?有更简单的东西吗?

由于某些原因,我无法让下面的一行工作,一个垃圾箱的情况。我想给所有的垃圾箱贴上标签。

Tidyverse解决方案会很棒,但我对所有解决方案都持开放态度。

代码语言:javascript
复制
df$bin_label <- 
  ifelse(df2$mpg_binned=="(16.3,22.1]", yes = "16.3 < mpg <= 22.1", no = df2$mpg_binned)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-26 02:21:49

由于我们事先不知道确切的breaks数据将被分割,一种选择是使用regex提取数字。所以对于mpg列,我们可以

代码语言:javascript
复制
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数量的增加而增长。

对于要对提取的数字执行一些数学操作的更新情况,我们可能需要分别提取数字。

代码语言:javascript
复制
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
#...
票数 1
EN

Stack Overflow用户

发布于 2019-08-26 02:23:44

下面是str_replace的一个选项,我们将数字部分作为一个组捕获,并替换为要添加字符串的组的反向引用(\\1\\2)。

代码语言:javascript
复制
library(tidyverse)
df %>% 
   rownames_to_column('rn') %>%
   mutate(bin_label  = str_replace(mpg_binned,
               "\\(([0-9.]+),([0-9.]+)\\]", "\\1 < mpg <= \\2")) %>%
   column_to_rownames('rn')

#                    mpg  mpg_binned cyl  disp  hp drat    wt  qsec vs am gear carb          bin_label
#Mazda RX4           21.0 (16.3,22.1]   6 160.0 110 3.90 2.620 16.46  0  1    4    4 16.3 < mpg <= 22.1
#Mazda RX4 Wag       21.0 (16.3,22.1]   6 160.0 110 3.90 2.875 17.02  0  1    4    4 16.3 < mpg <= 22.1
#Datsun 710          22.8   (22.1,28]   4 108.0  93 3.85 2.320 18.61  1  1    4    1   22.1 < mpg <= 28
#Hornet 4 Drive      21.4 (16.3,22.1]   6 258.0 110 3.08 3.215 19.44  1  0    3    1 16.3 < mpg <= 22.1
#Hornet Sportabout   18.7 (16.3,22.1]   8 360.0 175 3.15 3.440 17.02  0  0    3    2 16.3 < mpg <= 22.1
#Valiant             18.1 (16.3,22.1]   6 225.0 105 2.76 3.460 20.22  1  0    3    1 16.3 < mpg <= 22.1

或者另一个选项是提取数字部分和paste

代码语言:javascript
复制
df %>%
    rownames_to_column('rn') %>%
    mutate(bin_label = map_chr(str_extract_all(mpg_binned, "[0-9.]+"),
              ~ str_c(first(.x), "< mpg <= ", last(.x)))) %>%
   column_to_rownames('rn')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57651083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档