[R语言]Talk03 练习与作业

发表于 2022-01-05  183 次阅读


文章目录

练习与作业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, EducationInfant.Mortality列;
  • SarineInfant.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或等长.


  • attachdetach

问:这个两个函数的用途是什么?请用 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")
```

本站文章基于国际协议BY-NC-SA 4.0协议共享;
如未特殊说明,本站文章皆为原创文章,请规范转载。

0