【问题标题】:summarising data frame rows based on name prefix根据名称前缀汇总数据框行
【发布时间】:2017-02-24 21:42:59
【问题描述】:

我想创建一个汇总数据框,它根据文本前缀收集所有行,每个变量都有平均值、最大值和最小值。因此,在下面的示例中,我想总结“Jim”商店、“Jen、商店等”的平均值、最小值和最大值,以及每组商店中所有家具的相同值。

shop    tables  chairs  beds
jim-1   2   63  31
jim-2a  10  4   16
jim-2b  32  34  43
jen-1   32  90  32
jen-2   73  91  6
jen-3   35  85  65
sam-a   72  57  72
sam-b   18  48  11
sam-c   34  49  79
paul-1  43  49  23
paul-2  76  20  23
paul-2a 34  20  8

请注意,有些商店是 1、2、3 或 a、b、c 等,并且名称中的字母数量可能不定(jim vs paul)。我希望我的输出类似于:

shop_group  tables_av   tables_min  tables_max  chairs_av   chairs_min  chairs_max  beds_av beds_min    beds_max    furniture_av    furniture_min   furniture_max
jim 14.67   2.00    32.00   33.67   4.00    63.00   30.00   16.00   43.00   78.33   30.00   109.00
jen 46.67   32.00   73.00   88.67   85.00   91.00   34.33   6.00    65.00   169.67  154.00  185.00
sam 41.33   18.00   72.00   51.33   48.00   57.00   54.00   11.00   79.00   146.67  77.00   201.00
paul    51.00   34.00   76.00   29.67   20.00   49.00   18.00   8.00    23.00   98.67   62.00   119.00

提前谢谢...

【问题讨论】:

  • 使用dplyr 包,它会是这样的(假设您的数据框称为df):library(dplyr); df %>% group_by(shop) %>% summarise_all(funs(max, mean, min))。为此,您需要删除附加在每个名称上的多余连字符和数字,例如,每个jim 行都被标记为jim。你可以使用gsub

标签: r dplyr


【解决方案1】:

只需构建shop group,然后将aggregate和summary一起使用即可得到你想要的输出。

shop_group = sub("-.*", "", df$shop)
aggregate(df[,2:4], list(shop_group), 
     FUN = function(x) summary(x)[c(4,1,6)])
  Group.1 tables.Mean tables.Min. tables.Max. chairs.Mean chairs.Min. chairs.Max. beds.Mean beds.Min. beds.Max.
1     jen       46.67       32.00       73.00       88.67       85.00       91.00     34.33      6.00     65.00
2     jim       14.67        2.00       32.00       33.67        4.00       63.00     30.00     16.00     43.00
3    paul       51.00       34.00       76.00       29.67       20.00       49.00     18.00      8.00     23.00
4     sam       41.33       18.00       72.00       51.33       48.00       57.00     54.00     11.00     79.00

【讨论】:

  • 这正是我所追求的,但我只能打印输出,不能保存为 df。如果我尝试将您的代码更改为: summary_df
  • 奇数。我刚刚保存它并获得了所有字段。 AG = aggregate(df[,2:4], list(shop_group), FUN = function(x) summary(x)[c(4,1,6)])
【解决方案2】:

我仍然不知道为什么数据框没有正确输出,但以防万一其他人遇到同样的问题,这是同事提出的解决方案:

library(tibble)
library(dplyr)
library(magrittr)
df %>% 
mutate(shop = gsub("-.*", "", shop)) %>%
group_by(shop) %>%
summarise_each(funs(mean, min, max)) -> summary_df

【讨论】:

    猜你喜欢
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    相关资源
    最近更新 更多