【问题标题】:R: Is there a function to clean factor levels? characters columnwise in a data frame? [closed]R:有清理因子水平的功能吗?数据框中的字符列? [关闭]
【发布时间】:2018-06-01 20:31:34
【问题描述】:

我经常使用janitor 包中的clean_names() 函数。我想知道当列条目由因子名称或字符组成时,是否存在类似的函数来清理它们?

“干净”是指它应该与 janitor 包中的 clean_names() 函数执行相同的操作,例如将空格更改为下划线,将大写更改为小写,删除句号等...

谢谢!

【问题讨论】:

  • “清理列条目”是什么意思?

标签: r dataframe tidyr tidyverse


【解决方案1】:

只需使用来自janitor::clean_names() 的内部位:

# #' 'Clean' a character/factor vector like `janitor::clean_names()` does for data frame columns
# #'
# #' Most of the internals are from `janitor::clean_names()`
# #'
# #' @param x a vector of strings or factors
# #' @param refactor if `x` is a factor, return a ref-factored factor?
# #'        Default: `FALSE` == return character vector.
clean_vec <- function (x, refactor=FALSE) {

  require(magrittr, quietly=TRUE)

  if (!(is.character(x) || is.factor(x))) return(x)

  x_is_factor <- is.factor(x)

  old_names <- as.character(x)

  new_names <- old_names %>%
    gsub("'", "", .) %>%
    gsub("\"", "", .) %>%
    gsub("%", "percent", .) %>%
    gsub("^[ ]+", "", .) %>%
    make.names(.) %>%
    gsub("[.]+", "_", .) %>%
    gsub("[_]+", "_", .) %>%
    tolower(.) %>%
    gsub("_$", "", .)

  dupe_count <- sapply(1:length(new_names), function(i) {
    sum(new_names[i] == new_names[1:i])
  })

  new_names[dupe_count > 1] <- paste(
    new_names[dupe_count > 1], dupe_count[dupe_count > 1], sep = "_"
  )

  if (x_is_factor && refactor) factor(new_names) else new_names

}

例子:

vec <- stringi::stri_rand_strings(10, 10, pattern = "[A-Za-z0-9\\.\\-\\?_\\,\\*\\+]")

vec
##  [1] "TzMF-iCHX6" "v-b+2cpul5" "JPMwpP35K6" "5Z3RQf50Tb" "HaPzKB5jhH"
##  [6] "3gz6P4?0uU" "ofXkhP4Q1O" "?,4NvCjw,3" "AlG9dWJ,Ze" "MrPrvuYH4*"

clean_vec(vec)
##  [1] "tzmf_ichx6"  "v_b_2cpul5"  "jpmwpp35k6"  "x5z3rqf50tb" "hapzkb5jhh" 
##  [6] "x3gz6p4_0uu" "ofxkhp4q1o"  "x_4nvcjw_3"  "alg9dwj_ze"  "mrprvuyh4"

clean_vec(factor(vec))
##  [1] "tzmf_ichx6"  "v_b_2cpul5"  "jpmwpp35k6"  "x5z3rqf50tb" "hapzkb5jhh" 
##  [6] "x3gz6p4_0uu" "ofxkhp4q1o"  "x_4nvcjw_3"  "alg9dwj_ze"  "mrprvuyh4"

clean_vec(factor(vec), TRUE)
##  [1] tzmf_ichx6  v_b_2cpul5  jpmwpp35k6  x5z3rqf50tb hapzkb5jhh 
##  [6] x3gz6p4_0uu ofxkhp4q1o  x_4nvcjw_3  alg9dwj_ze  mrprvuyh4  
## 10 Levels: alg9dwj_ze hapzkb5jhh jpmwpp35k6 mrprvuyh4 ... x5z3rqf50tb

【讨论】:

  • 哇太棒了!不幸的是,这个问题被搁置了,但这对很多人来说真的很有用。
  • 我认为如果您调整问题以增加清晰度和一些示例,它将重新打开。
  • 很遗憾没有成功,但感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 2016-07-19
相关资源
最近更新 更多