【问题标题】:how to generate a dynamic summary table based on selected feature in the main data frame如何根据主数据框中的选定特征生成动态汇总表
【发布时间】:2021-03-02 04:17:35
【问题描述】:

您好,我有一个数据框,它是聚类的结果。示例如下:

        ave_remark_best ave_price_per_sqft    ave_age    ave_DOM ave_activity_rate cluster
1006332      1.00000000          1419.6900 12.0000000   7.000000         1.0000000       3
1010660      1.00000000           912.1800  7.0000000  10.000000         1.0000000       3
1012960      0.00000000           600.7400 26.3000000  36.100000         1.6666667       2
1013515      0.25000000           673.8725  9.7500000  10.500000         0.6666667       4
1014490      0.00000000           439.4600 31.0000000 104.000000         1.0000000       2
1018326      0.00000000           922.5500 12.0000000  10.000000         1.0000000       4
1018446      0.25000000           717.8285 16.0375000  30.387500        10.0000000       1

为了检查结果集群,我希望有一个函数来为每个集群创建所有这些特征的汇总表,所以我运行了如下所示的代码:

cluster_summary <- agent_temp %>% group_by(cluster) %>% summarise(n=n(),
                                                                  ave_activity_rate_c=mean(ave_activity_rate),
                                                                  ave_DOM_c =mean(ave_DOM),
                                                                  ave_age_c=mean(ave_age),
                                                                  ave_remark_best_c=mean(ave_remark_best),
                                                                  ave_price_per_sqft_c= mean(ave_price_per_sqft))

所以除了n,这个表中的每一个特征的名字都以variable+"_c"结尾。

现在我想通过使用一个函数来自动化这个过程;但是,我不确定如何使这个函数动态,以便它根据可用列自动生成列。所以基本上,如果主数据框现在如下所示:

        ave_remark_best ave_price_per_sqft    ave_age   cluster
1006332      1.00000000          1419.6900 12.0000000     3
1010660      1.00000000           912.1800  7.0000000     3
1012960      0.00000000           600.7400 26.3000000     2
1013515      0.25000000           673.8725  9.7500000     4
1014490      0.00000000           439.4600 31.0000000     2
1018326      0.00000000           922.5500 12.0000000     4
1018446      0.25000000           717.8285 16.0375000     1

所以它只生成一个包含 nave_remark_bestave_price_per_sqftave_age 的汇总表。 我该怎么做?

所以基本上,我的主要挑战是如何找到主数据框中存在哪些列,所以我通过这些列group_by 并创建摘要。

当然,函数应该是这样开始的:

cluster_summary_generator <- function (agent_sel, kout){
 
  agent_temp<-agent_sel                      
  agent_temp$cluster <- as.factor(kout$cluster)
  cluster_summary <- agent_temp %>% group_by(cluster) %>% .......
}

但我不知道如何完成这个

【问题讨论】:

  • 是否要将mean 函数应用于数据框中除cluster 之外的所有可用列?
  • 这些函数应该能够在我在示例中展示的两个数据帧上工作(一个数据帧有两个额外的特性)。我刚刚展示了版本,所以我澄清了列名称可能会改变,所以该函数应该能够自动识别这一点并根据数据框中可用的列创建摘要
  • @RonakShah,是的,基本上,首先我想按集群分组,然后应用到平均值,所以我计算每个集群的平均值。对我来说主要挑战是该函数应该能够动态应用于数据框

标签: r dataframe dplyr


【解决方案1】:

我们可以使用ensym 转换为符号并进行评估。既可以不带引号也可以带引号

cluster_summary_generator <- function (agent_sel, cl){
 agent_sel %>% 
    group_by(!! rlang::ensym(cl)) %>% 
     summarise(across(.fns = mean, na.rm = TRUE))
 }

cluster_summary_generator(df, cluster)
cluster_summary_generator(df, "cluster")

【讨论】:

    【解决方案2】:

    如果集群列总是被称为cluster,你可以使用:

    library(dplyr)
    cluster_summary_generator <- function (agent_sel){
      agent_sel %>% 
        group_by(cluster) %>% 
        summarise(across(.fns = mean, na.rm = TRUE))
    }
    
    cluster_summary_generator(df)
    

    如果集群列可以跨数据集更改,您可以将其作为参数传递给函数。

    cluster_summary_generator <- function (agent_sel, cl){
      agent_sel %>% 
        group_by({{cl}}) %>% 
        summarise(across(.fns = mean, na.rm = TRUE))
    }
    
    cluster_summary_generator(df, cluster)
    

    这将返回每个 cluster 的数据框中每一列的平均值,而与列数无关。

    【讨论】:

    • 感谢@Ronak Shah。你能解释一下.fns = mean在代码中做了什么吗?
    • across 有两个主要参数,.cols.fns.cols 指定我们要在哪一列上应用函数,.fns 是要应用的函数。 .cols 默认应用于数据框中的每一列,所以我没有提到它。在这里,我们希望将mean 应用于我们指定.fns = mean 的每一列。
    猜你喜欢
    • 1970-01-01
    • 2019-08-11
    • 2020-05-16
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多