Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 所有字符列的大小写是否正确_R_Data Manipulation_Data Cleaning_Mutate - Fatal编程技术网

R 所有字符列的大小写是否正确

R 所有字符列的大小写是否正确,r,data-manipulation,data-cleaning,mutate,R,Data Manipulation,Data Cleaning,Mutate,我觉得我遗漏了一些明显的东西,但我正试图将每一列中的每一个字符都大写。我基本上有一个混乱的数据集,其中有姓名、地址和电话号码,我想清理这些数据集,以便将姓名和地址大写。有些名字是完全小写的,有些是全大写的,有些是混合的 这就是我所做的,从另一个问题得到了资本化的代码,我不知道为什么它不起作用 simpleCap <- function(x) { s <- tolower(x) s <- strsplit(s, " ")[[1]] paste

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

这就是我所做的,从另一个问题得到了资本化的代码,我不知道为什么它不起作用

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=函数中出错: 对象的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))
下面是一种使用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
下面是一种使用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

也许您需要测试%>%mutateacrosswhereis.character,simpleCap或使用mutate\u如果测试%>%mutate\u为.character,simpleCap,我想不需要sapply@akrun对不起,哪个库是跨功能部分?它来自dplyr 1.0.0。如果您不赞成使用,请使用mutate_。最好显示一个小的可重复的示例。我看到在你的函数中,它是拆分字符串和子集[[1]]。也许这并不需要奇怪,我已经安装了dplyr,但它对我不起作用。我还尝试了mutate_if解决方案,但它使所有行都包含与第一行相同的数据,并将其复制到其余行中。IanCampbell的解决方案对我有效,测试%>%mutateAcrosswhere.character,~tools::toTitleCasetolower。或者test%>%mutate\u ifis.character、~tools::toTitleCasetolower。也许您需要test%>%mutateacrosswhere.character、simpleCap或使用mutate\u如果test%>%mutate\u ifis.character、simpleCap,我想不需要sapply@akrun对不起,哪个库是跨功能部分?它来自dplyr 1.0.0。如果您不赞成使用,请使用mutate_。最好显示一个小的可重复的示例。我看到在你的函数中,它是拆分字符串和子集[[1]]。也许这并不需要奇怪,我已经安装了dplyr,但它对我不起作用。我还尝试了mutate_if解决方案,但它使所有行都包含与第一行相同的数据,并将其复制到其余行中。IanCampbell的解决方案对我有效,测试%>%mutateAcrosswhere.character,~tools::toTitleCasetolower。或者test%>%mutate_ifis.character,~tools::toTitleCasetolower.@akrun这会处理不能转换为纯数字的字符向量或因子。最后一件事-有没有办法确保这会将单字母单词大写?举个例子,如果某人的名字是J,我想把它保持成那样,而不是那样,我可能会从您的问题的注释中使用akrun的simpleCap函数。@akrun此函数负责处理不能转换为纯数字的字符向量或因子。最后一件事-是否有办法确保将单字母单词大写?例如,如果某人的名字是J,我希望保持这样,而不是那样,我可能会根据您对问题的评论使用akrun的simpleCap函数。