The first problem is
when you have column headers that are values, not variable names.
(值作为了标题名)
例如:
> grade male female
1 A 5 3
2 B 4 1
3 C 8 6
4 D 4 5
5 E 5 5
##变量中的female和male就是上面所说的变量名中含有了变量,female和male应该是“性别”这个变量的的变量值
gather函数
> gather(students,sex,count,-grade)
> #第一个参数,为要操作的变量名,第二个参数为Key,即旧变量名生成的一个新变量的名称。第三个参数为原来的变量值生成新的一列的变量名,第四个负号表示不动grade一列(选取所有的其他列),也可以用:来正向选取连续几列
> #key, value
> Names of new key(新的变量名称,变量值为原来的旧变量名) & value columns(变量值列的新变量名), as strings or symbols.
grade sex count
1 A male 5
2 B male 4
3 C male 8
4 D male 4
5 E male 5
6 A female 3
7 B female 1
8 C female 6
9 D female 5
10 E female 5
作用:类似于Excel里的数据透视表,整理混乱的数据,新定义变量名字
The second messy data case
when multiple variables are stored in one column.
grade male_1 female_1 male_2 female_2
1 A 7 0 5 8
2 B 4 0 5 8
3 C 7 4 5 6
4 D 8 2 8 1
5 E 8 4 1 0
#与上一个问题类似,这个变量值也作为了变量名并且是交叉的两个。性别和级别()
解决办法分两步
第一,类似于上一种使用gather函数
> res<- gather(students2,sex_class,count,-grade)
> #第一个为输入的变量名,第二个为key——变量名生成一个新的变量,第三个变量为变量值,取变量值的变量名为count,最后负号表示不变动grade列
> > res
grade sex_class count
1 A male_1 7
2 B male_1 4
3 C male_1 7
4 D male_1 8
5 E male_1 8
6 A female_1 0
7 B female_1 0
8 C female_1 4
9 D female_1 2
10 E female_1 4
11 A male_2 5
12 B male_2 5
13 C male_2 5
14 D male_2 8
15 E male_2 1
16 A female_2 8
17 B female_2 8
18 C female_2 6
19 D female_2 1
20 E female_2 0
第二步:分离性别和等级
separate函数
> separate(res,sex_class,c("sex","class"))
> #第一个参数为输入变量,第二个参数为要分开的列,第三个参数为新的两个变量名。函数会自动识别分隔符,也可以指定,具体参考帮助文件
grade sex class count
1 A male 1 7
2 B male 1 4
3 C male 1 7
4 D male 1 8
5 E male 1 8
6 A female 1 0
7 B female 1 0
8 C female 1 4
9 D female 1 2
10 E female 1 4
11 A male 2 5
12 B male 2 5
13 C male 2 5
14 D male 2 8
15 E male 2 1
16 A female 2 8
17 B female 2 8
18 C female 2 6
19 D female 2 1
20 E female 2 0
前两种均为变量值是数据的变量名(列名)
A third symptom of messy data
when variables are stored in both rows and columns.
> students3
name test class1 class2 class3 class4 class5
1 Sally midterm A <NA> B <NA> <NA>
2 Sally final C <NA> C <NA> <NA>
3 Jeff midterm <NA> D <NA> A <NA>
4 Jeff final <NA> E <NA> C <NA>
5 Roger midterm <NA> C <NA> <NA> B
6 Roger final <NA> A <NA> <NA> A
7 Karen midterm <NA> <NA> C A <NA>
8 Karen final <NA> <NA> C A <NA>
9 Brian midterm B <NA> <NA> <NA> A
10 Brian final B <NA> <NA> <NA> C
问题: name一列不用动。class应该作为一个变量,期中期末应该也为一个变量的变量值
行和列均有变量值
解决办法分为以下几步:
第一步:合并
students3 %>%
gather( class, grade, class1:class5, na.rm= TRUE) %>%
#第一个参数为Key,即旧变量名生成的一个新变量的名称。
print
#结果
name test class grade
1 Sally midterm class1 A
2 Sally final class1 C
9 Brian midterm class1 B
10 Brian final class1 B
13 Jeff midterm class2 D
14 Jeff final class2 E
15 Roger midterm class2 C
16 Roger final class2 A
21 Sally midterm class3 B
22 Sally final class3 C
27 Karen midterm class3 C
28 Karen final class3 C
33 Jeff midterm class4 A
34 Jeff final class4 C
37 Karen midterm class4 A
38 Karen final class4 A
45 Roger midterm class5 B
46 Roger final class5 A
49 Brian midterm class5 A
50 Brian final class5 C
第二步:拆
spread函数
作用:类似于上面gather函数的反向操作,拆分某一列,让其变量值作为新的变量名
spread函数用来扩展,把某一列的值拆成多列。
students3 %>%
gather(class, grade, class1:class5, na.rm = TRUE) %>%
spread( test,grade ) %>%
#由于这里使用了 %>% 因此第一个输入变量省略。这里第一个参数是要拆分的列。拆分后的变量值作为新的变量名,其填充的变量值为第二个参数
print
#结果
name class final midterm
1 Brian class1 B B
2 Brian class5 C A
3 Jeff class2 E D
4 Jeff class4 C A
5 Karen class3 C C
6 Karen class4 A A
7 Roger class2 A C
8 Roger class5 A B
9 Sally class1 C A
10 Sally class3 C B
第三步:转化数字
parse_number()函数 {readr包}
students3 %>%
gather(class, grade, class1:class5, na.rm = TRUE) %>%
spread(test, grade) %>%
mutate(class=parse_number(class)) %>%
#提取一列中的数字
print
The fourth messy data problem
multiple observational units are stored in the same table.
> students4
id name sex class midterm final
1 168 Brian F 1 B B
2 168 Brian F 5 A C
3 588 Sally M 1 A C
4 588 Sally M 3 B C
5 710 Jeff M 2 D E
6 710 Jeff M 4 A C
7 731 Roger F 2 C A
8 731 Roger F 5 B A
9 908 Karen M 3 C C
10 908 Karen M 4 A A
问题:数据在单个表中包含多个观测单位。同一个人(id)有两条数据
解决办法:变成两张表
第一:提取id、name、sex一列
select函数
unique可以去除重复的观测
student_info <- students4 %>%
select(id, name, sex) %>%
unique%>%
print
第二:创建一个新表
gradebook <- students4 %>%
select(id,class,midterm,final)
#选取了四列,注意留下了id,与第一个表student_info匹配使用
The fifth and final messy data scenario
a single observational unit is stored in multiple tables.
与第四个正好相反,一个人的全部数据存在多张表中
数据passed 、failed
> passed
name class final
1 Brian 1 B
2 Roger 2 A
3 Roger 5 A
4 Karen 4 A
> failed
name class final
1 Brian 5 C
2 Sally 1 C
3 Sally 3 C
4 Jeff 2 E
5 Jeff 4 C
6 Karen 3 C
对于passed 新增一列status 表示passed
> passed <- mutate(passed,status="passed")
对failed及逆行同样的操作
>failed <- mutate(failed,status="failed")
bind_rows函数
作用:类似于cbind函数,还有bind_cols函数(针对列进行合并)
> bind_rows(passed,failed)
name class final status
1 Brian 1 B passed
2 Roger 2 A passed
3 Roger 5 A passed
4 Karen 4 A passed
5 Brian 5 C failed
6 Sally 1 C failed
7 Sally 3 C failed
8 Jeff 2 E failed
9 Jeff 4 C failed
10 Karen 3 C failed
以上内容来自使用swirl包学习tidyr包内容的个人总结