一个示例搞懂R数据分析的疑点






一个示例搞懂R数据分析的疑点

小师妹  生信果  2023-07-02 19:00:38

点击蓝字 关注我们


数据标准化是什么,怎么用?分位数在实际问题中怎么应用的?怎么评价多元的数据?下面这个案例在R环境中可以直接横扫数据分析的盲点。


问题:一组学生参加了数学、科学和英语考试。为了给学生确定一个单一的衡量指标,需要将这些科目的成绩组合起来。另外还想将前20%的学生评定为A,接下来的20%评定为B,依次类推。最后,希望按照字母顺序对学生排序。


分析问题:看到以上的数据,我们可以明显的发现很多障碍。


首先,三科考试的成绩是没办法比较的,由于他们的均值和标准差相差很远,所以对于他们求取平均值是没有意义的,因此在组合这些考试成绩之前,必须变换成可比较的单元。

其次,为了评定等级,需要一种方法来确定确定某学生得分上百分比排名。


再次,表示姓名的字段只有一个,让排序任务变复杂。


01

构建好数据集

options(digits=2)#限定了输出小数点后数字的位数,并且让输出更容易读Student <- c("John Davis", "Angela Williams", "Bullwinkle Moose","David Jones", "Janice Markhammer", "Cheryl Cushing","Reuven Ytzrhak", "Greg Knox", "Joel England","Mary Rayburn")Math <- c(502, 600, 412, 358, 495, 512, 410, 625, 573, 522)Science <- c(95, 99, 80, 82, 75, 85, 80, 95, 89, 86)English <- c(25, 22, 18, 15, 20, 28, 15, 30, 27, 18)roster <- data.frame(Student, Math, Science, English, stringsAsFactors=FALSE)

02

计算综合得分

z <- scale(roster[,2:4])#由于数学、科学和英语的分值不同(均值和标准差相差甚远),在组合之前需要先让数据变得可以比较

03

可以通过menan()和cbind()来将其插入

score <- apply(z,1,mean)roster <- cbind(roster, score)

04

用分位点来评定等级

y <- quantile(score,c(.8,.6,.4,.2))#第五步,通过逻辑运算符,根据学生的百分位数来重新编码为一个新的类别成绩变量。下面在数据框中创建了变量graderoster$grade[score >= y[1]] <- "A"roster$grade[score < y[1] & score >= y[2]] <- "B"roster$grade[score < y[2] & score >= y[3]] <- "C"roster$grade[score < y[3] & score >= y[4]] <- "D"roster$grade[score < y[4] ] <- "F"

06

用strsplit()函数以空格为界把学生姓名分隔开

name <- strsplit(roster$Student,split = " ")

07

第七步

你可以使用sapply()提取列表中每个成分的第一个元素,放入一个储存名字的向量first name,并提取每个成分的第二个元素,放入一个储存姓氏的向量lastname,最后删除不需要的Student的列就好。”[“是一个可以提取某个对象的一部分的函数,这里用与提取名字的第一个或者第二个变量

Firstname <- sapply(name, "[",1)Lastname <- sapply(name, "[",2)roster <- cbind(Firstname,Lastname,roster[,-1])

08

用函数order()进行排序

roster[order(Lastname,Firstname),]


有了这个案例对于理解R分析数据打下了一定的基础,除了在示例中分享的外,小师妹还想补充控制流的一步。

控制流

控制流重复执行某些语句,仅满足特定条件下执行另外语句。

基本概念:语句(statement);条件(cond);表达式(expr);序列(seq)


1、for结构

for (var in seq) statement


例如:

for (i in 1:10) print("hello")


2、while 结构

while (cond) statemnet


例如:

i<10while (i>0){print("Hello");i <- i-1}#这里需要控制好i,用i <- i-1,否则i一直大于0就会无限的循环


3、if-else结构

if (cond) statement

if (cond) statement1 else statement2


示例:

grade <- roster$gradeif(is.character(grade)) grade <- as.factor(grade)if(!is.factor(grade)) grade <- as.factor(grade) else print("grade is already is a factor")


相信你已经掌握了控制流的分析数据的能力啦~

现在很多成熟的云平台工具就可以实现满足我们的日常需求了,别忘了可以借助云平台的帮助哦http://www.biocloudservice.com/home.html


好了今天的分享就到这里啦,如果有问题欢迎和小师妹一起讨论哦~