练习与作业1:loop 初步
loop
练习 (部分内容来自 r-exercises.com 网站)
- 写一个循环,计算从1到7的平方并打印
print
; - 取
iris
的列名,计算每个列名的长度,并打印为下面的格式:Sepal.Length (12)
; - 写一个
while
循环,每次用rnorm
取一个随机数字并打印,直到取到的数字大于1; - 写一个循环,计算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
:
- 行、列平均,用
rowMeans
,colMeans
函数; - 行、列平均,用
apply
函数 - 行、列总和,用
rowSums
,colSums
函数; - 行、列总和,用
apply
函数 - 使用自定义函数,同时计算:
- 行平均、总和、 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
练习:
- 用 汽缸数 分组, 计算 油耗 的 平均值 ;
- 用 汽缸数 分组, 计算 wt 的 平均值 ;
用 dplyr
的函数实现上述计算
```{r}
## 代码写这里,并运行;
require(magrittr)
mtcars %$% tapply(mpg,cyl,mean)
mtcars %$% tapply(wt,cyl,mean)
```
练习lapply
和sapply
- 分别用
lapply
和sapply
计算下面list
里每个成员vector
的长度:
list( a = 1:10, b = letters[1:5], c = LETTERS[1:8] )
;
- 分别用
lapply
和sapply
计算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))} )
```
keep
和discard
- 保留
iris
中有factor
的列,并打印前10行; - 去掉
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 )
```
COMMENTS | NOTHING