R语言——swirl函数 tidyr包学习

QUESTION 1

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里的数据透视表,整理混乱的数据,新定义变量名字

QUESTION 2

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

QUESTION 3

前两种均为变量值是数据的变量名(列名)
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

QUESTION 4

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匹配使用

QUESTION 5

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包内容的个人总结

你可能感兴趣的:(R语言学习,r语言,数据分析)