如何使用dplyr将函数应用于所有非group_by列?
如何使用dplyr将函数应用于所有非group_by列?
我正在尝试使用dplyr包将一个函数应用于数据框中所有未被分组的列,这可以通过aggregate()
函数实现:
aggregate(. ~ Species, data = iris, mean)
其中mean
函数被应用于所有未用于分组的列。(是的,我知道可以使用aggregate函数,但我想要理解dplyr的用法。)
我可以使用summarize
函数来实现:
species <- group_by(iris, Species) summarize(species, Sepal.Length = mean(Sepal.Length), Sepal.Width = mean(Sepal.Width))
但是是否有一种方式可以让mean()
函数应用于所有未分组的列,类似于aggregate()
函数的. ~
表示法?我有一个包含30列的数据框需要进行聚合,因此写出单独的语句并不理想。
在使用dplyr包时,如果想要将一个函数应用于所有非group_by列,可以使用以下方法进行操作。
在上述代码中,首先使用group_by函数对数据进行分组操作,指定分组的列为Species。然后使用do函数对每个分组中的数据进行处理。在这个例子中,使用了一个自定义函数,该函数的功能是计算每个分组中所有数值型列的均值。具体而言,使用了Filter函数对每个分组中的数据进行筛选,只保留数值型列。然后使用sapply函数对每个数值型列应用mean函数,计算列的均值。最后将计算结果转换为data.frame的形式。
然而,需要注意的是,上述代码中使用的do函数在dplyr的0.2版本中可能会发生变化,因此并不推荐使用该方法。
那么,在dplyr中是否有更加简洁的方式来实现这个功能呢?答案是肯定的。在data.table中,可以使用如下代码实现相同的功能:data.table(iris)[,lapply(.SD, mean),Species]。
因此,可以使用dplyr的summarise_all函数来代替上述的do函数,从而实现对所有非group_by列应用函数的操作。具体而言,可以使用以下代码进行操作:
h = iris %>% group_by(Species) %>% summarise_all(.funs = list(mean))
在上述代码中,使用summarise_all函数对每个分组中的数据进行处理。通过指定.funs参数为list(mean),可以将mean函数应用于所有非group_by列。最后,使用group_by函数指定分组的列为Species。该代码的最终结果是得到一个包含每个分组中所有非group_by列的均值的数据框。
以上是使用dplyr包中的函数对所有非group_by列应用函数的方法。通过使用summarise_all函数,可以更加简洁地实现对数据的处理操作。
问题的出现原因:用户想要使用dplyr将一个函数应用到所有非group_by列上。
解决方法:可以尝试使用实验性的dplyr新功能summarise_each()
,该功能在dplyr 0.2版本中可用。使用summarise_each()
函数可以对每个非group_by列应用指定的函数,例如mean、min、max等。用户可以通过group_by()函数分组数据,然后使用summarise_each()函数对每个组应用函数。这样可以计算每个组中非group_by列的均值、最小值、最大值等。此外,还可以使用summarise_all()函数来替代summarise_each()函数进行相同的操作。需要注意的是,summarise_each()函数已被弃用。
以下是一些用户的反馈和注意事项。