练习与作业1,data.frame
注:以下内容来自 https://www.r-exercises.com/。
- 生成下面的
data.frame
的前三列,之后再增加Sex
这列
```{r}
## 先生成前三列;
df1 <- data.frame(Age = c(25,31,23,52,76,49,26),Height = c(177,163,190,179,163,183,164),Weight = c(57,69,83,75,70,83,53),row.names = list("Alex","Lilly","Mark","Oliver","Martha","Lucas","Caroline"))
## 再插入第四列
df1 <- cbind(df1,Sex=c("F","F","M","M","F","M","F"))
## 显示最终结果
df1
```
生成以下data.frame
,确保Working
这列的类型是 character
,而不是 factor
```{r}
## 生成 data.frame
df2 <- data.frame(Working = c("Yes","No","No","Yes","Yes","No","Yes"),row.names = list("Alex","Lilly","Mark","Oliver","Martha","Lucas","Caroline"))
## 显示结果
df2
## 显示 Working 列的性质
class(df2[,1])
```
检查系统自带变量 state.center
的内容,将其转化为 data.frame
```{r}
## 代码写这里,并运行;
str(state.center)
(as.data.frame(state.center))
```
生成一个 50行 * 5列 的matrix
,将其行名改为:row_i 格式,其中 i 为当前的行号,比如 row_1, row_2 等
```{r}
## 代码写这里,并运行;
matrix(nrow=50,ncol=5,dimnames = list(paste("row_",1:50),NULL))
```
- 使用系统自带变量
VADeaths
,做如下练习: - 检查
VADeaths
的类型,如果不是data.frame
,则转换之; - 添加新的一列,取名
Total
,其值每行的总合 - 调整列的顺序,将
Total
变为第一列。
```{r}
## 代码写这里,并运行;
class(VADeaths)
VADeaths.dataframe <- as.data.frame(VADeaths)
attach(VADeaths.dataframe)
(VADeaths.dataframe2 <- cbind(VADeaths.dataframe,Total = (`Rural Male`+`Rural Female`+`Urban Male`+`Urban Female`)))
detach(VADeaths.dataframe)
VADeaths.dataframe2[,c(5,1,2,3,4)]
```
- 用系统自带的
swiss
数据做练习: - 取子集,选取第1, 2, 3, 10, 11, 12 and 13行,第
Examination
,Education
和Infant.Mortality
列; - 将
Sarine
行Infant.Mortality
列的值改为NA; - 增加一列,命名为
Mean
,其值为当前行的平均值;
```{r}
## 代码写这里,并运行;
swiss1 <- swiss[c(1,2,3,10,11,12,13),c("Examination","Education","Infant.Mortality")]
swiss1[c("Sarine"),c("Infant.Mortality")] <- NA
attach(swiss1)
cbind(swiss1,Mean = c(mean(as.numeric(swiss1[1,]), na.rm=TRUE),
mean(as.numeric(swiss1[2,]), na.rm=TRUE),
mean(as.numeric(swiss1[3,]), na.rm=TRUE),
mean(as.numeric(swiss1[4,]), na.rm=TRUE),
mean(as.numeric(swiss1[5,]), na.rm=TRUE),
mean(as.numeric(swiss1[6,]), na.rm=TRUE),
mean(as.numeric(swiss1[7,]), na.rm=TRUE)))
```
- 将下面三个变量合并生成一个
data.frame
Id <- LETTERS
x <- seq(1,43,along.with=Id)
y <- seq(-20,0,along.with=Id)
```{r}
## 代码写这里,并运行;
Id <- LETTERS
x <- seq(1,43,along.with=Id)
y <- seq(-20,0,along.with=Id)
(data.frame(x=x,y=y,row.names = c(Id)))
```
问: seq
函数中的along.with
参数的意义是什么?请举例说明。
答:使seq()生成的x,y个数与Id中的元素个数相同
```{r}
## 代码写这里,并运行;
example1 <- c(1,2,3,4,5)
example2 <- seq(10,100,along.with = example1)
example2
```
- 提供代码,合并以下两个
data.frame
> df1 的内容
Id Age
1 14
2 12
3 15
4 10
>df2 的内容
Id Sex Code
1 F a
2 M b
3 M c
4 F d
合并之后的结果:
> M
Id Age Sex Code
1 14 F a
2 12 M b
3 15 M c
4 10 F d
```{r}
## 代码写这里,并运行;
df1 <- data.frame(Id=c(1,2,3,4),Age=c(14,12,15,10))
df1
df2 <- data.frame(Id=c(1,2,3,4),Sex=c("F","M","M","F"),Code = c("a","b","c","d"))
df2
M <- cbind.data.frame(df1,df2)
(M <- M[,-3])
```
从上面的data.frame
中删除code
列
```{r}
## 代码写这里,并运行;
M <- M[,-4]
M
```
- 练习,回答代码中的问题
## 1. 生成一个10 行2 列的data.frame
df3 <- data.frame( data = 1:10, group = c("A","B") );
## 2. 增加一列,其长度是1,可以吗?
cbind(df3, newcol = 1);
## 3. 增加一列,其长度是10,可以吗?
cbind(df3, newcol = 1:10);
## 4. 增加一列,其长度是2,可以吗?
cbind(df3, newcol = 1:2);
## 5. 增加一列,其长度是3,可以吗?
cbind(df3, newcol = 1:3);
答:前四个都可行,最后一个不可行,因为data.frame循环只有当被循环数据量能被循环数据量整除时可行
练习与作业2,tibble
- 运行以下代码,生成一个新的
tibble
:
```{r}
## 如果系统中没有 lubridate 包,则安装:
if (!require("lubridate")){
chooseCRANmirror();
install.packages("lubridate");
}
library(lubridate);
if (!require("tibble")){
chooseCRANmirror();
install.packages("tibble");
}
library(tibble);
tibble(
a = lubridate::now() + runif(1e3) * 86400,
b = lubridate::today() + runif(1e3) * 30,
c = 1:1e3,
d = runif(1e3),
e = sample(letters, 1e3, replace = TRUE)
)
```
从中可以看出,tibble
支持一些细分数据类型,包括:
<dttm>
<date>
等;
- 生成一个如下的
tibble
,完成以下任务:
df <- tibble(
x = runif(5),
y = rnorm(5)
)
任务:
- 取一列,比如
x
这一列,得到一个tibble
; - 取一列,比如
y
这一列,得到一个vector
;
```{r}
## 代码写这里,并运行;
require(tidyverse)
df <- tibble(x = runif(5),y = rnorm(5))
(as_tibble(df[,1]))
(as_vector(df[,2]))
```
用 tibble
函数创建一个新的空表,并逐行增加一些随机的数据,共增加三行:
```{r}
## 代码写这里,并运行;
## 新tibble, with defined columns ... 创建表头
tb <- tibble( name = character(), age = integer(), salary = double() );
##增加三行随机数据;
tb <- add_row(tb,name=LETTERS[sample(1:24,3)],age=sample(1:50,3),salary=sample(1:100,3))
tb
```
- ** 请解释为什么下面第一行代码能够运行成功,但第二个不行? **
这个可以:
data.frame(a = 1:6, b = LETTERS[1:2]);
但下面这个不行:
tibble(a = 1:6, b = LETTERS[1:2]);
问:为什么?tibble 循环的规则是什么?
答:因为b的数据量为2,既不是1也不是6的整数倍.tibble循环的recycling仅限于长度为1或等长.
attach
和detach
:
问:这个两个函数的用途是什么?请用 iris
这个系统自带变量举例说明。
答:attach函数将数据库路径添加到检索范围内,使得只要给出数据名即可检索对应数据而不需要给出其所在的位置。
detach用以解除attach的效果.举例如下:
不使用attach时
```{r}
(iris$Sepal.Length)
```
需要给出iris才能取用其中的Sepal.Length
使用attach时
可直接取用该数据而无需给出iris
```{r}
attach(iris)
(`Sepal.Length`)
detach(iris)
```
- 使用内置变量
airquality
: - 检查它是否是
tibble
; - 如果不是,转化为
tibble
;
```{r}
## 代码写这里,并运行;
is_tibble(airquality)
(as.tibble(airquality))
```
- 问:
tibble::enframe
函数的用途是什么?请举例说明:
答:将一或两组vector转化为tibble,列名将使用对应vector的名字,若vector未命名,则将使用vector的类型作为名字
```{r}
tibble::enframe(c(a=5,b=1))
```
- 简述
tibble
相比data.frame
的优势?并用实例展示
答:tibble可以使用前列数据计算后列,而data.frame不行;取用data.frame数据时会进行模糊匹配,可能导致错误,而tibble不会
```{r}
## 代码写这里,并运行;
tibble(x = 1:5, y = x ^2)
df <- data.frame(abc = 1)
df$ab;
```
练习与作业3:IO
- 提供代码,正确读取以下文件:
注:数据在当前目录下的 data/
子目录里
- Table0.txt
- Table1.txt
- Table2.txt
- Table3.txt
- Table4.txt
- Table5.txt
- Table6.txt
- states1.csv
- states2.csv
注2:每个文件读取需要提供两种方法,一种是利用系统自带函数,另一种是readr
包的函数;
```{r}
## 用系统自带函数,并显示读取的内容;
(read.table('data/Table0.txt',header = FALSE,comment.char = ""))
(read.table('data/Table1.txt',header = TRUE,comment.char = ""))
(read.table('data/Table2.txt',header = TRUE,comment.char = "",quote = "/",skip = c(1,2)))
(read.table('data/Table3.txt',header = TRUE,comment.char = "",skip = c(1,2)))
(read.table('data/Table4.txt',header = TRUE,comment.char = ""))
(read.table('data/Table5.txt',header = TRUE,sep=";",comment.char = ""))
(read.table('data/Table6.txt',header = TRUE,comment.char = "@",skip = c(1,2),nrows = c(10)))
(read.csv("data/states1.csv",header=TRUE,sep=",",quote = "\""))
(read.csv("data/states2.csv",header=TRUE,sep=";",quote = "\""))
## 用readr 包的函数读取,并显示读取的内容;
require(readr)
read_table("data/Table0.txt",col_names = FALSE)
read_table("data/Table1.txt",col_names = TRUE)
read_table("data/Table2.txt",skip=2,col_names = TRUE)
read_table("data/Table3.txt",skip=2,col_names = TRUE)
read_table("data/Table4.txt",col_names = TRUE)
read_delim("data/Table5.txt",col_names = TRUE,delim = ";")
read_table("data/Table6.txt",skip=2,col_names = TRUE,n_max = 10,comment = "@")
read_csv("data/states1.csv")
read_csv2("data/states2.csv")
```
COMMENTS | NOTHING