使用Tidyverse函数将tibble列中的多个唯一值重新编码为一个新值

时间:2019-01-31 18:47:36

标签: r

我正在尝试学习tidyverse的处理方式,我想知道是否存在使用tidyverse函数的方式将向量中的多个值重新编码为单个值而没有所有冗余。例如,使用以下标记作为一个非常通用的示例,是否有办法消除重复使用='lower'和='upper'?我认为会有一个明显的解决方案,但我找不到。

library(tidyverse)

T <- tibble(C1 = c('a','A','b','c','B','g','r'))

T

T %>%
  mutate(case = recode(C1, 'a' = 'lower', 'A' = 'upper', 'b' = 'lower', 'c' 
       = 'lower', 'B' = 'upper', 'g' = 'lower', 'r' = 'lower'))

基本R解决方案:

DF <- data.frame(C1 = c('a','A','b','c','B','g','r'), stringsAsFactors = 
          FALSE)

DF$case <- character(length = nrow(DF))

DF[DF$C1 %in% c('a','b','c','g','r'), ]$case <- 'lower'

DF[DF$C1 %in% c('A','B'), ]$case <- 'upper'

1 个答案:

答案 0 :(得分:0)

使用str_detect创建一个逻辑索引,然后将其更改为所需的类别

library(tidyverse)
T %>%
   mutate(case = c('upper', 'lower')[str_detect(C1, '^[a-z]+$')+ 1])

如果只有单个字母,则对内置的字母向量%in%letters使用LETTERS

T %>%
   mutate(case = ifelse(C1 %in% letters, 'lower', 'upper'))