3月 242013
 

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

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

( 连载中,待续 )

  30 Responses to “R 菜鸟入门篇 第08篇 习题”

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

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

    • 不丢人,达到目的就行了。Excel 用好了的话可以非常牛。

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

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

  3. 哈哈 握手握手。

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

  5. 哈哈,越发觉得喜欢上你这种实用派的了,

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

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

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

  9. 报个错,练习08.6,”性别所写”应为”性别缩写”

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

  11. 请问一下练习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列的数据

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

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

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

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

  14. 请问08.6这道题,我是把sex这列转化成字符型再转化回来,有更简洁的做法吗?

    x<-as.character(st_df$sex)
    y<-as.factor(ifelse(x==”female”,”f”,”m”),levels=f,m)
    cbind(st_df,y)

 填写评论

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

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(必填)

(必填)

This site uses Akismet to reduce spam. Learn how your comment data is processed.