【问题标题】:How to combine dplyr::mutate() and cut to generate different factor levels in one column如何结合 dplyr::mutate() 和 cut 在一列中生成不同的因子水平
【发布时间】:2019-09-12 11:05:45
【问题描述】:

我想根据一列的不同类别生成不同的因子水平,但是当我尝试以下操作时:

library(dplyr)
library(tidyr)
library(rap) # devtools::install_github("romainfrancois/rap")

df <- dplyr::tibble(
  category = rep(letters[1:2], each = 3),
  value = c(1, 4, 8, 21, 24, 28)
) %>% 
  tidyr::nest(data = -category) %>% 
  rap::rap(labels = ~ case_when(
    category == "a" ~ cut(data$value, c(0, 3, 6, 10), labels = c("< 3", "3 - 6", "> 6")),
    category == "b" ~ cut(data$value, c(0, 23, 26, 30), labels = c("< 23", "23 - 26", "> 26"))
  )
  )
#> Warning in `[<-.factor`(`*tmp*`, i, value = structure(1:3, .Label = c("<
#> 23", : invalid factor level, NA generated

df
#> # A tibble: 2 x 3
#>   category           data labels   
#>   <chr>    <list<df[,1]>> <list>   
#> 1 a               [3 × 1] <fct [3]>
#> 2 b               [3 × 1] <fct [3]>

reprex package (v0.3.0) 于 2019 年 9 月 12 日创建

第二类关卡我得到NA

df %>% 
  unnest(labels)
#> # A tibble: 6 x 3
#>   category value labels
#>   <chr>    <dbl> <fct> 
#> 1 a            1 < 3   
#> 2 a            4 3 - 6 
#> 3 a            8 > 6   
#> 4 b           21 <NA>  
#> 5 b           24 <NA>  
#> 6 b           28 <NA>

有人知道如何根据不同的类别生成不同的关卡吗?

这是所需的输出:

#> # A tibble: 6 x 3
#>   category value labels
#>   <chr>    <dbl> <fct> 
#> 1 a            1 < 3   
#> 2 a            4 3 - 6 
#> 3 a            8 > 6   
#> 4 b           21 < 23  
#> 5 b           24 23 - 26  
#> 6 b           28 > 26

【问题讨论】:

  • 你可以做df %&gt;% mutate(lable = case_when(category == "a" &amp; value &lt; 3 ~ "&lt; 3", category == "a" &amp; value %in% c(3:6) ~ "3-6", category == "a" &amp; value &gt; 6 ~ "&gt; 6", category == "b" &amp; value &lt; 23 ~ "&lt; 23", category == "b" &amp; value %in% c(23:26) ~ "23-26", category == "b" &amp; value &gt; 26 ~ "&gt; 26", TRUE ~ NA_character_))
  • 确实如此,但后来我失去了因素
  • 你为什么要用嵌套的数据做这个?这样做有什么好处/你的计划?
  • 因为我想保留每个类别的因子水平

标签: r dplyr factors


【解决方案1】:

使用基础 R within()

df1 <- within(df1, {
  labels[category == "a"] <- as.character(cut(value[category == "a"], 
                                              breaks=c(0, 3, 6, 10), 
                                              labels=c("< 3", "3 - 6", "> 6")))
  labels[category == "b"] <- as.character(cut(value[category == "b"], 
                                              breaks=c(0, 23, 26, 30), 
                                              labels=c("< 23", "23 - 26", "> 26")))
  labels <- as.factor(labels)
})
df1
# # A tibble: 6 x 3
#   category value labels 
#   <chr>    <dbl> <fct>  
# 1 a            1 < 3    
# 2 a            4 3 - 6  
# 3 a            8 > 6    
# 4 b           21 < 23   
# 5 b           24 23 - 26
# 6 b           28 > 26   

数据

df1 <- structure(list(category = c("a", "a", "a", "b", "b", "b"), value = c(1, 
4, 8, 21, 24, 28)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

【讨论】:

    猜你喜欢
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多