在这节中,我们将学习lapply()和sapply()两个作为循环功能中最重要的两个函数。它以及其他相关的vapply(),tapply()提供了一个方便的手段去执行数据分析中的“Split-Apply-Combine”
将资料组放在一个叫flags的变量中,更多的信息可以在http://archive.ics.uci.edu/ml/datasets/Flags中找到。我们可以用head(flags)来看这个内置数据集的前6行,可以用dim(flags)来查看这个集的维数和大小。
作为任何数据集,我们想知道变量存储的形式,即每种变量的类型是怎么样的,我们可以用class(flags).通过这种方式,我们可以看出整个数据集是以data.frame的形式来进行存储的,但是我们并不知道每种变量他们各自的存储形式。如果想知道,我们需要单独对每一列的元素使用class(),这样最好使用循环的方式来进行。即使用lapply()和sapply()。
则输出查看结果,形式如下图所示:
lapply()中的l代表列表list,如果使用class(cls_list),出来的结果是列表“list”。从而得到每列元素的数据类型。
sapply()函数允许在幕后自动调用lapply()函数,然后尝试将结果简化。
这时可以发现,其出来的结果简化成了符号向量。
总的来说,如果结果是每个元素都是长度为1的列表,那么sapply()返回的就是一个向量,s代表简化;如果结果每个元素向量都大于1且长度相等,则sapply()函数返回一个矩阵;其他情况就返回一个列表,和lapply()函数没有差别。
数据集的11到17列是指示变量,并且每个都代表了一个不同的颜色
这里需要注意逗号的意思代表我们想要所有行,但只要11到17列。
由此我们可以看出,sapply()函数可以把结果简化成向量,那是因为列表中的每一个元素长度都为1
下面我们来举一个sapply()函数不能简化lapply()函数的例子。unique()函数返回一个所有相同值都被移除的向量。