R语言-列表

本文详细介绍了R语言中列表(List)的创建、基本操作及ply函数的应用,如lapply、sapply、mapply等。通过实例展示了如何使用列表存储不同类型数据,以及如何对列表元素进行查看、引用、添加等操作。同时,重点讲解了如何利用ply函数对列表进行统计计算,如计算均值、标准差和分位数。最后,演示了do.call函数将多个数据框拼接成一个大数据框的实用技巧。
# 2.1.5 列表(List)
#列表可以容纳各种类型的数据对象,向量、矩阵、数据框和另一个列表
### 1.创建 ###
list(a,b,c,d) #把四个对象组合成一个list对象
#例:
(example = list("abc", 3:5, matrix(1, nrow = 3, ncol = 4), data.frame(x = 1:4, y = paste0("boy_", 1:4))))
##  [[1]] #字符
##  [1] "abc" 
##  
##  [[2]] #数值向量
##  [1] 3 4 5 
##  
##  [[3]] #矩阵
##       [,1] [,2] [,3] [,4]
##  [1,]    1    1    1    1
##  [2,]    1    1    1    1
##  [3,]    1    1    1    1  
##  
##  [[4]] #数据框
##    x     y
##  1 1 boy_1
##  2 2 boy_2
##  3 3 boy_3
##  4 4 boy_4
### 2.基本操作 ###
str()# (一)查看
#例:
(complex = list(first = list(1:2), second = list(letters, list(matrix(1:4, nrow = 2, ncol = 2)))))
##  $first
##  $first[[1]]
##  [1] 1 2
##  
##  
##  $second
##  $second[[1]]
##   [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
##  [18] "r" "s" "t" "u" "v" "w" "x" "y" "z"
##  
##  $second[[2]]
##  $second[[2]][[1]]
##       [,1] [,2]
##  [1,]    1    3
##  [2,]    2    4
str(complex)
##  List of 2
##   $ first :List of 1
##    ..$ : int [1:2] 1 2
##   $ second:List of 2
##    ..$ : chr [1:26] "a" "b" "c" "d" ...
##    ..$ :List of 1
##    .. ..$ : int [1:2, 1:2] 1 2 3 4
#(二)引用
# 利用名字引用元素
complex$first  
##  [[1]]
##  [1] 1 2
# 利用序号引用元素
complex[[1]]
##  [[1]]
##  [1] 1 2
#(三)添加元素
# 利用序号添加元素
complex[[3]] = matrix(1, 2, 3); complex
##  $first
##  $first[[1]]
##  [1] 1 2
##  
##  
##  $second
##  $second[[1]]
##   [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
##  [18] "r" "s" "t" "u" "v" "w" "x" "y" "z"
##  
##  $second[[2]]
##  $second[[2]][[1]]
##       [,1] [,2]
##  [1,]    1    3
##  [2,]    2    4
##  
##  
##  
##  [[3]]
##       [,1] [,2] [,3]
##  [1,]    1    1    1
##  [2,]    1    1    1
# 利用名字添加元素
complex$new = 1:5; complex
##  $first
##  $first[[1]]
##  [1] 1 2
##  
##  
##  $second
##  $second[[1]]
##   [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
##  [18] "r" "s" "t" "u" "v" "w" "x" "y" "z"
##  
##  $second[[2]]
##  $second[[2]][[1]]
##       [,1] [,2]
##  [1,]    1    3
##  [2,]    2    4
##  
##  
##  
##  [[3]]
##       [,1] [,2] [,3]
##  [1,]    1    1    1
##  [2,]    1    1    1
##  
##  $new
##  [1] 1 2 3 4 5
### 3.列表中的**ply函数 ###
lapply() #对列表中的每个元素实施某种”相同的操作“,如求均值、方差、分位数
sapply() #lapply()是以列表形式输出,sapply()以向量、矩阵形式输出
mapply() #sapply()的多变量版本
tapply(x,f,g) #进行分组统计,需要向量 x (x不可以是数据框),因子或因子列表 f , 函数 g(按照f对x分组,在分组后的向量上运行函数 g)
vapply() #与sapply()相似,他可以预先指定的返回值类型
rapply() #递归版本的lapply,它只处理list类型数据
# 老王耗子药的单价,单位(元/袋)
(price = list(year2014 = 36:33, year2015 = 32:35, year2016 = 30:27))
##  $year2014
##  [1] 36 35 34 33
##  
##  $year2015
##  [1] 32 33 34 35
##  
##  $year2016
##  [1] 30 29 28 27
# lapply返回列表(对列表、数据框数据集进行循环,输入为列表,返回值为列表)
lapply(price, mean)
##  $year2014
##  [1] 34.5
##  
##  $year2015
##  [1] 33.5
##  
##  $year2016
##  [1] 28.5
lapply(price, sd)
##  $year2014
##  [1] 1.290994
##  
##  $year2015
##  [1] 1.290994
##  
##  $year2016
##  [1] 1.290994
lapply(price, quantile)
##  $year2014
##     0%   25%   50%   75%  100% 
##  33.00 33.75 34.50 35.25 36.00 
##  
##  $year2015
##     0%   25%   50%   75%  100% 
##  32.00 32.75 33.50 34.25 35.00 
##  
##  $year2016
##     0%   25%   50%   75%  100% 
##  27.00 27.75 28.50 29.25 30.00
# sapply默认返回向量或矩阵(类似于lapply函数,但输入为列表,返回值为向量)
sapply(price, mean)
##  year2014 year2015 year2016 
##      34.5     33.5     28.5
sapply(price, sd)
##  year2014 year2015 year2016 
##  1.290994 1.290994 1.290994
sapply(price, quantile)
##       year2014 year2015 year2016
##  0%      33.00    32.00    27.00
##  25%     33.75    32.75    27.75
##  50%     34.50    33.50    28.50
##  75%     35.25    34.25    29.25
##  100%    36.00    35.00    30.00
# mapply实现了将price与amount对应元素相乘的效果
(amount = list(year2014 = rep(200, 4), year2015 = rep(100, 4), year2016 = rep(300, 4)))
##  $year2014
##  [1] 200 200 200 200
##  
##  $year2015
##  [1] 100 100 100 100
##  
##  $year2016
##  [1] 300 300 300 300
(income_quarter = mapply("*", price, amount))
##       year2014 year2015 year2016
##  [1,]     7200     3200     9000
##  [2,]     7000     3300     8700
##  [3,]     6800     3400     8400
##  [4,]     6600     3500     8100
# 练习题:总收入(Page89)
(income_year = mapply(function(x, y) {sum(x*y)}, price, amount))
##  year2014 year2015 year2016 
##     27600    13400    34200
### 4.list对象的其他快捷玩法 ###
do.call() #告诉list一个函数,然后list里的所有元素来执行这个函数
#例:
Sunday1 = data.frame("经度" = rep(39.95, 5), "纬度" = rep(116.3, 5), "地点" = rep("熊孩子玩耍基地", 5))
Sunday2 = data.frame("经度" = rep(39.96, 5), "纬度" = rep(116.4, 5), "地点" = rep("论文生产基地", 5))
Sunday3 = data.frame("经度" = rep(39.97, 5), "纬度" = rep(116.5, 5), "地点" = rep("工业实践基地", 5))
(example = list(Sunday1, Sunday2, Sunday3))
##  [[1]]
##     经度  纬度           地点
##  1 39.95 116.3 熊孩子玩耍基地
##  2 39.95 116.3 熊孩子玩耍基地
##  3 39.95 116.3 熊孩子玩耍基地
##  4 39.95 116.3 熊孩子玩耍基地
##  5 39.95 116.3 熊孩子玩耍基地
##  
##  [[2]]
##     经度  纬度         地点
##  1 39.96 116.4 论文生产基地
##  2 39.96 116.4 论文生产基地
##  3 39.96 116.4 论文生产基地
##  4 39.96 116.4 论文生产基地
##  5 39.96 116.4 论文生产基地
##  
##  [[3]]
##     经度  纬度         地点
##  1 39.97 116.5 工业实践基地
##  2 39.97 116.5 工业实践基地
##  3 39.97 116.5 工业实践基地
##  4 39.97 116.5 工业实践基地
##  5 39.97 116.5 工业实践基地
do.call(rbind, example)
##      经度  纬度           地点
##  1  39.95 116.3 熊孩子玩耍基地
##  2  39.95 116.3 熊孩子玩耍基地
##  3  39.95 116.3 熊孩子玩耍基地
##  4  39.95 116.3 熊孩子玩耍基地
##  5  39.95 116.3 熊孩子玩耍基地
##  6  39.96 116.4   论文生产基地
##  7  39.96 116.4   论文生产基地
##  8  39.96 116.4   论文生产基地
##  9  39.96 116.4   论文生产基地
##  10 39.96 116.4   论文生产基地
##  11 39.97 116.5   工业实践基地
##  12 39.97 116.5   工业实践基地
##  13 39.97 116.5   工业实践基地
##  14 39.97 116.5   工业实践基地
##  15 39.97 116.5   工业实践基地
####################################################
#总结#
list(a,b,c,d) #把四个对象组合成一个list对象
str()# 查看
apply() #对一个数组按行或者按列进行计算
lapply() #对列表中的每个元素实施某种”相同的操作“,如求均值、方差、分位数
sapply() #lapply()是以列表形式输出,sapply()以向量、矩阵形式输出
mapply() #sapply()的多变量版本
tapply(x,f,g) #进行分组统计,需要向量 x (x不可以是数据框),因子或因子列表 f , 函数 g(按照f对x分组,在分组后的向量上运行函数 g)
vapply() #与sapply()相似,他可以预先指定的返回值类型
rapply() #递归版本的lapply,它只处理list类型数据
do.call() #告诉list一个函数,然后list里的所有元素来执行这个函数
####################################################
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值