【问题标题】:Different level of aggregation in R [duplicate]R中不同级别的聚合[重复]
【发布时间】:2021-12-24 12:11:32
【问题描述】:

如何在 data.farme 的不同级别聚合。

示例:

数据:

> dput(sampledata)
structure(list(city = c("a", "a", "b", "b", "c", "c"), workerID = c("1", 
"2", "3", "4", "5", "6"), salary = c(50000, 1e+05, 60000, 3e+05, 
40000, 80000)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-6L))

解决方案:

left_join(sampledata, 
            sampledata %>%
              group_by(city) %>%
              summarise(city_level_mean = mean(salary)))

输出:

Joining, by = "city"
# A tibble: 6 × 4
  city  workerID salary city_level_mean
  <chr> <chr>     <dbl>           <dbl>
1 a     1         50000           75000
2 a     2        100000           75000
3 b     3         60000          180000
4 b     4        300000          180000
5 c     5         40000           60000
6 c     6         80000           60000

还有其他解决方案吗?

【问题讨论】:

  • merge(sampledata,aggregate(cbind(city_level_mean=salary)~city,data=sampledata,mean),by="city")
  • @camille 我同意你的看法

标签: r dplyr


【解决方案1】:

Iman 问题的一个微妙之处在于,是否可以采用一种技术来创建聚合数据列 city_level_mean,而无需将汇总数据与原始数据框重新连接。

如果使用dplyr::mutate() 而不是summarise(),则可以在没有left_join 的情况下聚合数据。

df <- structure(list(city = c("a", "a", "b", "b", "c", "c"), workerID = c("1", "2", "3", "4", "5", "6"), salary = c(50000, 1e+05, 60000, 3e+05, 40000, 80000)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))

library(dplyr)

df %>% 
     group_by(city) %>%
     mutate(city_level_mean = mean(salary))

...和输出:

> df %>% 
+      group_by(city) %>%
+      mutate(city_level_mean = mean(salary))
# A tibble: 6 x 4
# Groups:   city [3]
  city  workerID salary city_level_mean
  <chr> <chr>     <dbl>           <dbl>
1 a     1         50000           75000
2 a     2        100000           75000
3 b     3         60000          180000
4 b     4        300000          180000
5 c     5         40000           60000
6 c     6         80000           60000
> 

使用data.table 包的相同操作如下所示。我们创建一个新列 city_level_mean 作为 salary 列的平均值,使用 city 作为分组。

# data.table approach
library(data.table)
df_dt <- as.data.table(df)
df_dt[,city_level_mean := mean(salary),city]
df_dt

...和输出:

> df_dt <- as.data.table(df)
> df_dt[,city_level_mean := mean(salary),city]
> df_dt
   city workerID salary city_level_mean
1:    a        1  5e+04           75000
2:    a        2  1e+05           75000
3:    b        3  6e+04          180000
4:    b        4  3e+05          180000
5:    c        5  4e+04           60000
6:    c        6  8e+04           60000

【讨论】:

    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2014-01-24
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多