如何在多个DataFrame中使用sapply批量计算列最大值并解决名称显示问题
问题描述
我有三个DataFrame:AAA、BBB、CCC,希望批量计算每个DataFrame各列的最大值,不想重复执行sapply(AAA, max)、sapply(BBB, max)、sapply(CCC, max)。我尝试用循环实现,代码如下:
dfs = list(AAA, BBB, CCC) for(df in dfs){ print(deparse(substitute(df))) print(sapply(df, max)) readline(prompt="Press [enter] to continue") }
原本想用print(deparse(substitute(df)))打印出AAA、BBB、CCC,但实际输出的都是df。请问如何修复该问题?或者有没有其他方法可以同时对多个DataFrame应用sapply?
解决方案
方法一:修复循环的名称显示问题
创建列表时未保留DataFrame的原名称,导致循环无法获取对象名。给列表元素命名后,遍历列表名称即可解决:
# 为列表元素添加对应名称 dfs = list(AAA = AAA, BBB = BBB, CCC = CCC) # 遍历列表的名称 for(df_name in names(dfs)){ print(df_name) # 通过名称取出对应DataFrame并计算列最大值 print(sapply(dfs[[df_name]], max)) readline(prompt="Press [enter] to continue") }
此方法会正确打印AAA、BBB、CCC,同时输出对应DataFrame的列最大值。
方法二:用嵌套sapply批量处理
无需循环,直接对命名后的列表应用嵌套sapply,一次性得到所有结果:
dfs = list(AAA = AAA, BBB = BBB, CCC = CCC) # 外层处理列表中的每个DataFrame,内层计算各列最大值 result = sapply(dfs, function(x) sapply(x, max)) print(result)
输出结果为矩阵,行对应原DataFrame的列名,列对应AAA、BBB、CCC,可直观查看所有DataFrame的列最大值。
内容的提问来源于stack exchange,提问作者miguel
相关产品推荐
相关产品推荐

