在一次数据分析的实验上,需要处理数据分析的问题,最后需要根据姓和名进行排序,但是由于姓名是中文,排序的结果有问题

  • 没有处理中文的排序
  • 处理之后的排序

初步想法是根据中文的笔画排序,然后百度到了可以使用tmcn来实现,然后就开始下tmcn,直接使用install.packages("tmcn", repos = "http://R-Forge.R-project.org")下载失败报错图1,然后又百度到可以直接去对应网页下载好包,然后本地去安装,再次报错图2.在下载的网页上发现需要下载包源 (.tar.gz),或者更新R图3,不想换R的版本,选择下载包源 (.tar.gz)。再次安装,还是失败图4。再次发现只需要R大于3.0.0版本就可以图5,而我的版本是4.1.3图5,完全满足。翻看之前R的代码发现应该是镜像的问题,抱着尝试的心态install.packages("tmcn", repos = "http://mirrors.tuna.tsinghua.edu.cn/CRAN/"),结果成功安装图7,然后载入包.查看包里的函数图8,没有发现我需要的,但是发现了一个字符串转换拼音的函数,于是使用这个toPinyin()函数对向量Name进行转换拼音,接着进行上述的操作,得到了排序后的结果。

图1

R语言对中文名称 r语言用户名中文_R语言对中文名称


图2


R语言对中文名称 r语言用户名中文_r语言_02


图3


R语言对中文名称 r语言用户名中文_R语言对中文名称_03


图4


R语言对中文名称 r语言用户名中文_ci_04


图5


R语言对中文名称 r语言用户名中文_R语言对中文名称_05


图6


R语言对中文名称 r语言用户名中文_R语言对中文名称_06


图7


R语言对中文名称 r语言用户名中文_r语言_07


图8


R语言对中文名称 r语言用户名中文_数据分析_08

程序代码

#1.
Name <- c("张三", "王五", "赵四", "王军", "孙浩", "周斌","钱能", "吴林", "王美","郭杰")
Math <- c(502, 600, 412, 358, 495, 512, 410, 625, 573, 522)
Science <- c(95, 99, 80, 82, 75, 85, 80, 95, 89, 86)
Chinese <- c(25, 22, 18, 15, 20, 28, 15, 30, 27, 18)
roster <- data.frame(Name, Math, Science, Chinese, stringsAsFactors = FALSE)
#2.
dim(roster)
summary(roster)
#3.
mathscore <- summary(roster)
maxmath <- mathscore[6, 2]
minmath <- mathscore[1, 2]
meanmath <- mathscore[4, 2]
#4.1
z <- scale(roster[, 2:4])
#4.2
score <- apply(z, 1, mean)
roster <- cbind(roster, score)
#4.3
y <- quantile(score, c(.8, .6, .4, .2))
#4.4
roster$grade[score >= y[1]] <- "甲"
roster$grade[score < y[1] & score >= y[2]] <- "乙"
roster$grade[score < y[2] & score >= y[3]] <- "丙"
roster$grade[score < y[3] & score >= y[4]] <- "丁"
roster$grade[score < y[4]] <- "戊"
#4.5
name <- strsplit((roster$Name), "")
#4.6
xing <- sapply(name, "[", 1)
ming <- sapply(name, "[", 2)
#4.7
roster <- cbind(xing, ming,roster[, -1])
#4.8
roster <- roster[order(xing, ming), ]

#
install.packages("tmcn", repos = "http://mirrors.tuna.tsinghua.edu.cn/CRAN/")
library(tmcn)
help(package="tmcn")
Name <- toPinyin(c("张三", "王五", "赵四", "王军", "孙浩", "周斌","钱能", "吴林", "王美","郭杰"))
#然后按照上面的步骤重新来一次
Math <- c(502, 600, 412, 358, 495, 512, 410, 625, 573, 522)
Science <- c(95, 99, 80, 82, 75, 85, 80, 95, 89, 86)
Chinese <- c(25, 22, 18, 15, 20, 28, 15, 30, 27, 18)
roster <- data.frame(Name, Math, Science, Chinese, stringsAsFactors = FALSE)
z <- scale(roster[, 2:4])
score <- apply(z, 1, mean)
roster <- cbind(roster, score)
y <- quantile(score, c(.8, .6, .4, .2))
roster$grade[score >= y[1]] <- "甲"
roster$grade[score < y[1] & score >= y[2]] <- "乙"
roster$grade[score < y[2] & score >= y[3]] <- "丙"
roster$grade[score < y[3] & score >= y[4]] <- "丁"
roster$grade[score < y[4]] <- "戊"
name <- strsplit((roster$Name), "")
xing <- sapply(name, "[", 1)
ming <- sapply(name, "[", 2)
roster <- cbind(xing, ming,roster[, -1])
roster <- roster[order(xing, ming), ]

最终是用了tmcn包的toPinyin()函数完成了,但是我有些思路,感觉可以写个函数,从数据库里查表,查到对应汉字的笔画,根据笔画排序,或者还有个不是办法的办法,写个函数,一共也就不到20个汉字,写不到20个if,全部穷举/doge