[R语言]Talk08 练习与作业

发表于 2022-01-06  179 次阅读


文章目录

练习与作业1:loop 初步


loop练习 (部分内容来自 r-exercises.com 网站)

  1. 写一个循环,计算从1到7的平方并打印 print
  2. iris的列名,计算每个列名的长度,并打印为下面的格式: Sepal.Length (12)
  3. 写一个while循环,每次用 rnorm取一个随机数字并打印,直到取到的数字大于1;
  4. 写一个循环,计算Fibonacci序列的值超过1百万所需的循环数;注:Fibonacci 序列的规则为:0, 1, 1, 2, 3, 5, 8, 13, 21 ...;
```{r}
## 代码写这里,并运行;
require(tidyverse)
for(x in 1:7){
  print(x^2)
}
iris_colnames<-colnames(iris)
for( x in 1:ncol(iris)){
  print(paste(iris_colnames[x],"(",str_length(iris_colnames[x]),")"))
}

while((x=rnorm(1))<=1){
  print(x)
}
x1=0
x2=1
fsum=x1+x2
n=1
while (fsum<=1000000) {
  x1=x2
  x2=fsum
  fsum=x1+x2
  n=n+1
}
print(n)

```

练习与作业2:loop进阶,系统和其它函数


生成一个数字matrix,并做练习

生成一个 100 x 100 的数字 matrix

  1. 行、列平均,用rowMeans, colMeans函数;
  2. 行、列平均,用 apply 函数
  3. 行、列总和,用rowSums, colSums 函数;
  4. 行、列总和,用 apply 函数
  5. 使用自定义函数,同时计算:
  • 行平均、总和、 sd
  • 列平均、总和、 sd
```{r}
## 代码写这里,并运行;
work2 <- matrix(sample(1:100),nrow = 100,ncol = 100)
rowMeans(work2)
colMeans(work2)
work2 %>%apply(1, median)
work2 %>% apply(2,median)
rowSums(work2)
colSums(work2)
work2 %>% apply(1,sum)
work2 %>% apply(2,sum)
work2 %>% apply(1,function(x){return(c(mean=mean(x),sum=sum(x),sd=sd(x)))})
work2 %>% apply(2,function(x){return(c(mean=mean(x),sum=sum(x),sd=sd(x)))})

```

mtcars进行练习

tapply练习:

  1. 汽缸数 分组, 计算 油耗平均值
  2. 汽缸数 分组, 计算 wt平均值

dplyr 的函数实现上述计算

```{r}
## 代码写这里,并运行;
require(magrittr)
mtcars %$% tapply(mpg,cyl,mean)
mtcars %$% tapply(wt,cyl,mean)
```

练习lapplysapply

  1. 分别用 lapplysapply 计算下面list里每个成员 vector的长度:

list( a = 1:10, b = letters[1:5], c = LETTERS[1:8] );

  1. 分别用 lapplysapply 计算 mtcars 每列的平均值;
```{r}
## 代码写这里,并运行;
list2 <- list( a = 1:10, b = letters[1:5], c = LETTERS[1:8] )
list2 %>% lapply(length)
list2 %>% sapply(length)
mtcars %>% lapply(mean)
mtcars %>% sapply(mean)

```

练习与作业3:loop进阶,purr包的函数


map初步

生成一个变量:

df <- tibble(
  a = rnorm(10),
  b = rnorm(10),
  c = rnorm(10),
  d = rnorm(10)
)

map 计算:

  • 列 平均值、总和和中值
```{r}
## 代码写这里,并运行;
df <- tibble(
  a = rnorm(10),
  b = rnorm(10),
  c = rnorm(10),
  d = rnorm(10)
)
df %>% map(function(x){return(c(mean=mean(x),sum=sum(x),median=median(x)))})

```

map进阶

map 配合 purr 包中其它函数,用 mtcars

为每一个 汽缸数 计算 燃油效率mpg与重量wt的相关性(Pearson correlation),得到 p 值和 correlation coefficient 值。

```{r}
## 代码写这里,并运行;
mtcars %>% split( .$cyl ) %>% map( ~ cor.test( .$mpg, .$wt ) )%>%
  map(function(afmap){
    return(c(p=afmap$p.value,correlation.coefficient=afmap$estimate))} )
```

keepdiscard

  1. 保留 iris 中有 factor 的列,并打印前10行;
  2. 去掉 iris 中有 factor 的列,并打印前10行;
```{r}
## 代码写这里,并运行;
result1 <- iris %>% keep(is.factor)
head(result1,10)
result2 <- iris %>% discard(is.factor)
head(result2,10)
```

reduce

reduce 得到以下三个vector中共有的数字:

c(1, 3, 5, 6, 10),
  c(1, 2, 3, 7, 8, 10),
  c(1, 2, 3, 4, 8, 9, 10)
```{r}
numlist <- list(
  c(1, 3, 5, 6, 10),
  c(1, 2, 3, 7, 8, 10),
  c(1, 2, 3, 4, 8, 9, 10)
)
numlist %>% reduce(intersect)
```

运行以下代码,观察得到的结果,并用tidyverse包中的 spread 等函数实现类似的结果

dfs <- list(
age = tibble(name = "John", age = 30),
sex = tibble(name = c("John", "Mary"), sex = c("M", "F")),
trt = tibble(name = "Mary", treatment = "A")
);

dfs %>% reduce(full_join);

```{r}
## 代码写这里,并运行;
dfs <- list(
  age = tibble(name = "John", age = 30),
  sex = tibble(name = c("John", "Mary"), sex = c("M", "F")),
  trt = tibble(name = "Mary", treatment = "A")
);

dfs %>% reduce(full_join);
bind_rows(dfs)%>%gather(things,value,-name,na.rm = T) %>% spread(things,value)
```

练习与作业4:并行计算


安装相关包,成功运行以下代码,观察得到的结果,并回答问题

* parallel
* foreach
* iterators
```{r}
library(parallel); ## 
library(foreach);
library(iterators);

## 检测有多少个 CPU --
( cpus <- parallel::detectCores() );

## 创建一个 data.frame 
d <- data.frame(x=1:10000, y=rnorm(10000));

## make a cluster --
cl <- makeCluster( cpus - 1 );

## 分配任务 ... 
res <- foreach( row = iter( d, by = "row" ) ) %dopar% {
  return ( row$x * row$y  );
}

## 注意在最后关闭创建的 cluster 
stopCluster( cl );

summary(unlist(res));
```

:你的系统有多少个CPU?此次任务使用了多少个?
:用代码打印出相应的数字即可:

```{r}
## 代码写这里,并运行;
( cpus <- parallel::detectCores() );
( cpus - 1 )

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

0