R 菜鸟入门篇 第08篇 习题

纸上谈兵没有用,实战是练兵最有效的方法。本篇是习题集。做习题之前,对前面的某些内容作个小结,顺便热热身。

开胃小菜:你大可以邊用邊學啊!需要用到的先學,其它的就放一邊,只要能善用一些常用到的功能,又何必要那麼深入呢?而且您在使用當中經常會發現一些新功能,這又會馬上讓您給賺到了。–语出大家來學VIM

到目前为止,我们遇到过向量、矩阵、数据框,这些都叫做对象的类型。它们的区别和联系在哪里?

向量,vector,是最简单的对象。向量由一个或多个同类变量组成。

x <- c(1, 1, 2, 2, 3)  # 生成一个向量。
is.character(x)  # x 是字符型吗?
## [1] FALSE
is.numeric(x)  # x 是数字型吗?
## [1] TRUE
mode(x)  # 是数字型。
## [1] "numeric"
y <- c(3, 4, 4, 5, 5)
z <- c(x, y)  # 多个向量并在一起。
z
##  [1] 1 1 2 2 3 3 4 4 5 5
z[4]  # 向量的下标。
## [1] 2

矩阵,matrix,与向量差不多,不同的是分成了行和列。

m <- matrix(c(2, 3, 1, 5), nrow = 2, ncol = 2)  # 生成一个矩阵,指定行数和列数。
m
##      [,1] [,2]
## [1,]    2    1
## [2,]    3    5
m <- matrix(c(2, 3, 1, 5), nrow = 2)  # 生成一个矩阵,指定行数。
m
##      [,1] [,2]
## [1,]    2    1
## [2,]    3    5
m <- matrix(seq(1, 20, 1), nrow = 5, byrow = TRUE)  # 生成一个矩阵,指定行数,并按行排列。
m
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12
## [4,]   13   14   15   16
## [5,]   17   18   19   20
m <- matrix(seq(1, 20, 1), nrow = 5, byrow = FALSE)  # 生成一个矩阵,指定行数,并按列排列。
m[2, 2]  # 矩阵的下标。
## [1] 7

数据框,dataframe,与矩阵差不多,区别在于,各列可以是不同类型。完全相当于 Excel 的表格。

a <- c(1, 2, 3, 4)
b <- seq(5, 8, by = 1)
d <- data.frame(a, b)  # 生成一个数据框。
d
##   a b
## 1 1 5
## 2 2 6
## 3 3 7
## 4 4 8
is.data.frame(d)  # 是数据框吗?
## [1] TRUE
str(d)  # 数据框的结构。
## 'data.frame':    4 obs. of  2 variables:
##  $ a: num  1 2 3 4
##  $ b: num  5 6 7 8
class(d)
## [1] "data.frame"
nrow(d)
## [1] 4
ncol(d)
## [1] 2
e <- c(9, 10)
f <- rbind(d, e)  # 给数据框增加一行。
f
##   a  b
## 1 1  5
## 2 2  6
## 3 3  7
## 4 4  8
## 5 9 10
g <- c("one", "two", "three", "four", "five")
class(g)
## [1] "character"
h <- cbind(f, g)  # 给数据框增加一列。
h
##   a  b     g
## 1 1  5   one
## 2 2  6   two
## 3 3  7 three
## 4 4  8  four
## 5 9 10  five
class(h)
## [1] "data.frame"
ncol(h)
## [1] 3
colnames(h) <- c("one", "two", "three")  # 更改列名称。
h
##   one two three
## 1   1   5   one
## 2   2   6   two
## 3   3   7 three
## 4   4   8  four
## 5   9  10  five

下面开始习题。练习的内容主要是复习已经学过的,并提升一点点。点击这里下载练习数据。

# 练习 08.1 读入数据。
任务:读入练习数据,保存到一个叫 st_df 的对象中,并初步查看。
提示:read.csv(), file.show(), str(), summary()。

# 练习 08.2 数据类型。
任务:查看 st_df的类型。
提示:is.numeric(), is.character()... , str(), class()。

# 练习 08.3 矩阵。
任务:生成一个 5 行 6 列的矩阵,取值为整数数列 1:30。
提示:matrix(), seq()。

# 练习 08.4 矩阵与数据框。
任务:将 st_df 转换成矩阵对象 st_mt,并比较 st_df 与 st_mt 的区别。从二者选择 shoe 列。选择第 3, 4, 6, 17 行。选择除了 3, 4, 6, 17 行之外的其他行。
提示: as.matrix(), is.numeric(), mode(), st_mt[,], is.character(), class(), rownames(), %in%, !。


# 练习 08.5 作图。
任务:做图,x 为 st_df 中 shoe 一列, y 为 hand 一列,数据点用红色的原点。
任务:做图,x 为 shoe 一列, y 为 sex 一列。
提示: plot(), points(), lines(), boxplot(), par(mfrow=c(, )), ?plot

# 练习 08.6 数据框操作。
任务:给 st_df 增加一列性别所写(此处录入错误,应为“缩写”。感谢yuan网友指出错误。),列名称为 sex2,取值是 f 和 m,f 表示女性,m 表示 男性。
提示:ifelse()。

# 练习 08.7 计算。
任务:st_df 数据框中包含了多少名男生和多少名女生?
提示:table(), summary()。
任务:st_df 中的鞋号是英码,请增加一列鞋号,取值是鞋号的中国尺码。转换方法自行搜索。
提示:round()。

# 练习 08.8 因子。
任务:给st_df 增加一列 shoe_factor,取值是因子类型的鞋号。比较 shoe ~ sex 和 shoe_factor ~ sex 的箱式图。
提示:as.factor(), boxplot(), par(mfrow=c(1, 2))

# 练习 08.9 作图。
任务:做散点图,x 为鞋号,y 为身高。横坐标同时出现英码刻度和中国尺码刻度。图片保存为 pdf 文件。
提示:seq(), par(), plot(... , axes=FALSE, ...), axis(), mtext(), box(), pdf(), dev.off()。

菜鸟学 R,不必面面俱到,多练练习题,上手之后就会喜欢上 R,就有兴趣深入了解下去。

( 连载中,待续 )

R 菜鸟入门篇 第08篇 习题》上有28条评论

  1. Uicheap

    矩阵什么的,当年在大学里认真听了几节课,弄懂了个逻辑学起来很容易上手。但是要忘记也是一件很容易的事。

    回复
    1. dapeng 文章作者

      是啊,只有常用才记得住。不知道以前学过的多少知识都还给老师了。

      回复
  2. Yang

    我的好好学习这些基础的东西,我现在很多数据框的增减都还在excel里面操作的,真丢人。

    回复
      1. Yang

        哈哈,我现在想起来就好笑。我之前不会用for循环,想做重复分析时,直接在excel里做了个填一个变量,然后就生成所有代码的,然后拷代码到R里面看结果。

        回复
        1. dapeng 文章作者

          英雄所见略同,我也这么做过。到现在有时候对文件批量重命名的时候我仍会这么做。

  3. 卡卡

    你大可以邊用邊學啊!需要用到的先學,其它的就放一邊,只要能善用一些常用到的功能,又何必要那麼深入呢?而且您在使用當中經常會發現一些新功能,這又會馬上讓您給賺到了
    —-
    说的很好啊,想想自己以前下那么多功夫,都跑偏了

    回复
  4. 卡卡

    练习很有必要啊,看上去貌似很简单,自己却未必能正确写出来

    回复
  5. 卡卡

    练习 08.8中的shoe_factor ~ sex 箱式图做不出来的吧,两个都是因子呢

    回复
  6. 卡卡

    练习 08.8中的 横坐标同时出现英码刻度和中国尺码刻度 ,这个怎么弄呢?

    回复
  7. 路今草

    d<-data.frame(a,b)中,mode(d)为list,class(d)为data.frame
    而对于a<-c(1,2,3,4),mode和class都是numeric
    博主能解释下其中区别吗?

    回复
    1. 大鹏 文章作者

      这个问题我从来没有注意过,以后也不会注意,因为平时用不着。网上比较容易搜到答案,我贴出来供您参考:

      The class() is used to define/identify what “type” an object is from the point of view of object-oriented programming in R. typeof() gives the “type” of object from R’s point of view, whilst mode() gives the “type” of object from the point of view of Becker, Chambers & Wilks (1988). The latter may be more compatible with other S implementations according to the R Language Definition manual.

      ‘mode’ is a mutually exclusive classification of objects according to their basic structure. The ‘atomic’ modes are numeric, complex, charcter and logical. Recursive objects have modes such as ‘list’ or ‘function’ or a few others. An object has one and only one mode.
      ‘class’ is a property assigned to an object that determines how generic functions operate with it. It is not a mutually exclusive classification. If an object has no specific class assigned to it, such as a simple numeric vector, it’s class is usually the same as its mode, by convention.

      回复
  8. 大熊

    请问一下练习08.4里面的类似于下面这个例子该怎么写啊?只知道两个向量x的哪些元素在y中,用%in%,不在不知道怎么写

    temp_m <- matrix(data = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15), nrow = 5, ncol = 3)
    temp_m
    [,1] [,2] [,3]
    [1,] 1 6 11
    [2,] 2 7 12
    [3,] 3 8 13
    [4,] 4 9 14
    [5,] 5 10 15

    问题:求出除3,5行之外的其它行,及第3列的数据

    请问一下这个要怎么写啊?谢谢

    回复
  9. 大熊

    练习 08.8 因子。 shoe ~ sex的箱形图不能画出来吧,因为shoe不是因子?

    回复
  10. 艾尔

    请问您做的这个练习题有答案或者案例吗,我们考试之前老师让我们做这个练习题,可是我不知道自己对不对,如果可以的话,可以给我的邮箱发一下答案吗,谢谢^^

    回复
    1. 大鹏 文章作者

      抱歉,这个练习题目前没有答案。你不妨把你的答案贴出来,供大家参考。

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax