【发布时间】: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 %>% mutate(across(where(is.character), simpleCap))或mutate_iftest %>% mutate_if(is.character, simpleCap)我想没有必要sapply -
@akrun 抱歉,跨函数部分属于哪个库?
-
它来自
dplyr1.0.0。mutate_if应该被弃用。最好展示一个可重现的小例子。我看到在您的函数中,它正在拆分字符串并子集[[1]]。可能不需要 -
很奇怪,我安装了 dplyr,但它对我不起作用。我也尝试了 mutate_if 解决方案,但它使所有行都包含相同的数据(它适用于第一行,并将其复制到其余行)。
-
IanCampbell 的解决方案对我有用
test %>% mutate(across(where(is.character), ~ tools::toTitleCase(tolower(.))))或test %>% mutate_if(is.character, ~ tools::toTitleCase(tolower(.)))
标签: r data-manipulation data-cleaning dplyr