【问题标题】:Proper capitalization for all character columns所有字符列的正确大写
【发布时间】:2020-10-26 00:54:34
【问题描述】:

我觉得我遗漏了一些明显的东西,但我试图将每一列中的每个单词都大写,这是一个字符。我基本上有一个包含姓名、地址和电话号码的凌乱数据集,我想清理它以便将姓名和地址大写。有些名称完全小写,有些全大写,有些混合。

这就是我所做的(从此处的另一个问题中获得了大写的代码),我不确定它为什么不起作用。

simpleCap <- function(x) { 
  s <- tolower(x) 
  s <- strsplit(s, " ")[[1]] 
  paste(toupper(substring(s, 1,1)), substring(s, 2), sep="", collapse=" ") 
} 

test <- test %>%
  mutate_if(function(.) is.character(.), sapply(., simpleCap))

我得到的错误是: “get(.x, .env, mode = "function") 中的错误: 找不到模式'function'的对象'email@email.com'”

编辑:这是我的数据集的一个示例:

test <- data.frame("name" = c("Ellie Golding", "angela smith", "JOHN DOE", "jake elSON"), 
                 "address" = c("123 magic lane", "321 MAGIC LANE", "200 magIC LANE", "99 Magic Lane"),
                 "phone" = c(123, 122, 111, 132))
test <- test %>%
    mutate(name = as.character(name), address = as.character(address), phone = as.numeric(phone))

【问题讨论】:

  • 也许你需要test %&gt;% mutate(across(where(is.character), simpleCap))mutate_if test %&gt;% mutate_if(is.character, simpleCap) 我想没有必要sapply
  • @akrun 抱歉,跨函数部分属于哪个库?
  • 它来自dplyr 1.0.0。 mutate_if 应该被弃用。最好展示一个可重现的小例子。我看到在您的函数中,它正在拆分字符串并子集[[1]]。可能不需要
  • 很奇怪,我安装了 dplyr,但它对我不起作用。我也尝试了 mutate_if 解决方案,但它使所有行都包含相同的数据(它适用于第一行,并将其复制到其余行)。
  • IanCampbell 的解决方案对我有用 test %&gt;% mutate(across(where(is.character), ~ tools::toTitleCase(tolower(.))))test %&gt;% mutate_if(is.character, ~ tools::toTitleCase(tolower(.)))

标签: r data-manipulation data-cleaning dplyr


【解决方案1】:

这是tools::toTitleCase 的一种方法,它是一个基本包:

library(dplyr) # Version >= 1.0.0
library(purrr)
test %>%
  mutate(across(.cols = which(map_lgl(.,~any(is.na(as.integer(as.character(.x)))))),
                ~ tools::toTitleCase(tolower(.))))
#           name        address phone
#1 Ellie Golding 123 Magic Lane   123
#2  Angela Smith 321 Magic Lane   122
#3      John Doe 200 Magic Lane   111
#4    Jake Elson  99 Magic Lane   132

【讨论】:

  • @akrun 这会处理字符向量或不转换为纯数字的因子。
  • 最后一件事 - 有没有办法确保将单字母单词大写?例如,如果某人的名字是 A J,我会希望保持这样,而不是 j
  • 在这种情况下,我可能会在你的问题上使用来自 cmets 的 akrun 的 simpleCap 函数。
猜你喜欢
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 2017-08-10
  • 2017-11-27
相关资源
最近更新 更多