列表子集化

使用 purrr 掌握函数式编程基础

Auriel Fournier

Instructor

来谈谈列表!

lo[["data"]] <- data.frame(bird = c("robin", "sparrow", "jay"),
                           weight = c(76, 14, 100),
                           wing_length = c(100, 35, 130))
lo[["model"]] <- lm(weight ~ wing_length,
            data = lo[["data"]])
lo[["plot"]] <- ggplot(
            data = lo[["model"]], 
            aes(x = weight, y = wing_length)) +
                  geom_point()
使用 purrr 掌握函数式编程基础

索引数据框和列表

数据框

mtcars[1, "wt"]
mtcars$wt

 

2.62
 [1] 2.620 2.875 2.320 3.215 3.440 
 [6] 3.460 3.570 3.190 3.150 3.440 
[11] 3.440 4.070 3.730 3.780 5.250 
[16] 5.424 5.345 2.200 1.615 1.835 
[21] 2.465 3.520 3.435 3.840 3.845 
[26] 1.935 2.140 1.513 3.170 2.770 
[31] 3.570 2.780
使用 purrr 掌握函数式编程基础

索引数据框和列表

列表

lo[[2]]
Call:
lm(formula = weight ~ wing_length, 
     data = lo[["data"]])

Coefficients:
(Intercept)  wing_length  
   -17.3216       0.9131

 

lo[["model"]]
Call:
lm(formula = weight ~ wing_length, 
    data = lo[["data"]])

Coefficients:
(Intercept)  wing_length  
   -17.3216       0.9131
使用 purrr 掌握函数式编程基础

不使用 purrr 的逐元素计算

# 创建承载结果的数据框
df_rows <- data.frame(names = names(survey_data),
                      rows = NA)
# 遍历 survey_data,统计每个元素的行数
for(i in seq_along(survey_data)){
    df_rows[i,'rows'] <- nrow(survey_data[[i]]) 
}
# 打印 survey_rows
df_rows
     names rows
1 LakeErieS   14
2 LakeErieN   14
3 LakeErieW   14
4 LakeErieE   15
使用 purrr 掌握函数式编程基础

用 purrr 对每个元素计算

# 获取 survey_data 的摘要
summary(survey_data)
          Length Class      Mode
LakeErieS 2      data.frame list
LakeErieN 2      data.frame list
LakeErieW 2      data.frame list
LakeErieE 2      data.frame list
# 统计 survey_data 中的行数
map(survey_data, ~nrow(.x))
$`LakeErieS`
[1] 14

$`LakeErieN`
[1] 14

$`LakeErieW`
[1] 14

$`LakeErieE`
[1] 15
使用 purrr 掌握函数式编程基础

Let's purrr-actice!

使用 purrr 掌握函数式编程基础

Preparing Video For Download...