R实战0-数据处理难题的一套解决方案

对数据的处理现在普遍就是两种方案,python 或者 R。

一组学生参加了数学 科学和英语的考试。考试完成之后,需要給学生确定一个成绩衡量指标。会把综合成绩的前20%评定为A,接着是B C D F。
数据原始集
可以看到数据处理的一个障碍,三科成绩无法比较,或者说比较没有意义。。
:) 当然有人认为可以这么处理,比如知道数学的总分是700,将成绩全部换为以100分为计量单位的。。
当然英语也是,,计总分为50分,换成对应100的来处理。。。

也许吧,可以试试 :)

在这我们使用R来进行处理。

  • 根据原始的学生花名册将数据采集进去,自然是选择数据框的格式。
1
2
3
4
5
6
7
8

options(digits = 2)
stduent <- c("John Davis", "Angela Willams", "Bully Moose", "David Jones", "Janice Markhammer", "Cherry 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(stduent, Math, Science, English, stringsAsFactors = FALSE)
roster

we get

1
2
3
4
5
6
7
8
9
10
11
12
13

> roster
stduent Math Science English
1 John Davis 502 95 25
2 Angela Willams 600 99 22
3 Bully Moose 412 80 18
4 David Jones 358 82 15
5 Janice Markhammer 495 75 20
6 Cherry Cushing 512 85 28
7 Reuven Ytzrhak 410 80 15
8 Greg Knox 625 95 30
9 Joel England 573 89 27
10 Mary Rayburn 522 86 18

这里有两个细节没有注意。。
一个是刚好十个学生;另外一个是貌似student单词貌似拼写错了。。

  • 由于三科考试的分值不同,如何让它们变得可以进行比较。一种方式是将数据进行标准化,使用单位标准差来表示,这个过程使用scale()函数来实现。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

z <- scale(roster[,2:4])
```
we get

```R
z
Math Science English
[1,] 0.013 1.078 0.587
[2,] 1.143 1.591 0.037
[3,] -1.026 -0.847 -0.697
[4,] -1.649 -0.590 -1.247
[5,] -0.068 -1.489 -0.330
[6,] 0.128 -0.205 1.137
[7,] -1.049 -0.847 -1.247
[8,] 1.432 1.078 1.504
[9,] 0.832 0.308 0.954
[10,] 0.243 -0.077 -0.697
attr(,"scaled:center")
Math Science English
501 87 22
attr(,"scaled:scale")
Math Science English
86.7 7.8 5.5


```

- 使用mean()函数计算各行的均值来获得综合得分,并且使用函数cbind()函数将其添加到花名册当中。

```R

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


```

计算均值之后,并把score分数加进去。

- 函数quantile()给出学生综合得分的百分位数。
这个函数可以综合得分的百分位数

```R

y <- quantile(score, c(.8, .6, .4, .2))

```
- 使用逻辑运算符,重编码为A B C D F。

```R

roster$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"

```
- 使用函数strsplit()以空格为界,将学生姓名拆分为姓和名。

name <- strsplit((roster$stduent), “ “)

1
2
3
4
5

注意返回的是什么值,这里是列表!!


- 使用函数sapply()提取列表元素。

lastname <- sapply(name, “[“, 2)
firstname <- sapply(name, “[“, 1)
roster <- cbind(firstname, lastname, roster[, -1])

1
2
3
将原来的student化成两列,一列是姓,一列是名,同时也将student列舍弃掉。

- 使用order()函数依据姓氏和名字对数据集进行排序

roster <- roster[order(lastname, firstname),]
roster

1
2

finally we get

roster
firstname lastname Math Science English score grade
6 Cherry Cushing 512 85 28 0.35 C
1 John Davis 502 95 25 0.56 B
9 Joel England 573 89 27 0.70 B
4 David Jones 358 82 15 -1.16 F
8 Greg Knox 625 95 30 1.34 A
5 Janice Markhammer 495 75 20 -0.63 D
3 Bully Moose 412 80 18 -0.86 D
10 Mary Rayburn 522 86 18 -0.18 C
2 Angela Willams 600 99 22 0.92 A
7 Reuven Ytzrhak 410 80 15 -1.05 F

```

Done!!!!!!